Linux:如何删除所有文件名长度超过 X 个字符的文件?

Linux:如何删除所有文件名长度超过 X 个字符的文件?

我想删除当前目录和子目录中文件名超过特定长度的所有文件。

有没有一种简单的方法可以从 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,但它不会被拆分为和。-0grep commandpath/abc\ndef\npath/abcdef

由于您很少会找到\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

相关内容