如何删除文件夹中名称长度超过X的所有文件?

我有一个文件夹里面有成千上万个文件,它们的命名方式是23123、123r3883、3929388394j、f38238d等等。我需要删除所有文件名长度大于9的文件。请问我该如何操作?

必须使用bash吗?zsh有一些方便的通配符限定符可以处理这种情况。 - steeldriver
1请勿使用谷歌翻译,只翻译文本内容: https://superuser.com/a/702461/276585 并且不,我不会抄袭fossie在那里的回答 :D - Rinzwind
1个回答

你可以使用一个简单的通配符表达式??????????*匹配文件名至少包含10个字符。因此,只要文件的数量不是太多,你就可以使用。
echo rm -- ??????????*

对于较长的文件列表,你可以使用 xargs 来分割名称:
printf '%s\0' -- ??????????* | xargs -r0 echo rm

如果你从bash切换到zsh,你可以利用glob qualifiers来测试每个文件名的长度(通过REPLY变量传递)。一个优点是你可以轻松地添加其他限定符,比如N(相当于bash shell的nullglob)和.(将结果限制为普通文件):
echo rm -- *(.Ne:'[[ $#REPLY -gt 9 ]]':)

或者

print -rNC1 -- *(.Ne:'[[ $#REPLY -gt 9 ]]':) | xargs -r0 echo rm

在bash中实现相同的功能可能需要一个循环,例如:
for f in *; do
  [[ -f $f && $#f -gt 9 ]] && echo rm -- "$f"
done

一旦确认匹配的文件正确,就删除echo

1或者 find -maxdepth 1 -type f -name "?????????*" -delete - pLumo