我想删除当前目录和子目录中文件名超过特定长度的所有文件。
有没有一种简单的方法可以从 bash 中做到这一点?
答案1
您已经提供了一个find
对于奇怪命名的文件而言是安全的命令:
find -regextype posix-egrep -type f -regex '.*[^/]{5}' -delete
此正则表达式匹配不包含斜杠的五个尾随字符(即文件名长度超过五个字符)。
您提供的 Bash 循环通常会起作用,但它可能无法扩展数千个文件,并且可能会因特殊文件名而中断。
另一种方法效率相似,但可能提供更多的灵活性(替换rm
为-n1 echo
打印所有文件):
find -type f -print0 | grep -Ez '[^/]{5}$' | xargs -0 rm
、-print0
和选项确保每个文件名都以 NUL 字节结尾。这可确保特殊字符不会拆分文件名(换行符会破坏您提供的 Bash 命令)。虽然这仍然会因诸如(其中是换行符)之类的名称而失败-z
,但它不会被拆分为和。-0
grep command
path/abc\ndef
\n
path/abc
def
由于您很少会找到\n
名称中包含的文件,因此我将这种情况的实现留给读者作为练习。
答案2
您可以使用 来find
定位当前目录和子目录中的所有文件,然后使用 bash 测量文件名的长度并相应地删除:
$ find . -type f | while IFS= read -r file; do
## find will return the full path, strip the
## path from the file name.
name=$(basename "$file");
## Check the name'slength and delete if > 5
[ "${#name}" -gt 5 ] && rm "$file";
done
或者,你可以find
使用-regex
和执行所有操作-delete
。例如,要删除超过 5 个字符的文件名(不包括路径):
find . -type f -regextype posix-egrep -regex '.*[^/]{5}' -delete