我一直在使用以下命令:
find . | awk 'function base(f){sub(".*/", "", f); return f;} \
{print length(base($0)), $0}'| sort -nr | head -2
它会找到一些文件名太长的文件,但不是全部,并且不会删除它们。
我可以使用什么命令来完成此任务?
答案1
如果您有 GNU find
,则可以使用正则表达式来查找名称超过给定长度的文件。例如,这将查找名称为 20 个字符或更多字符的文件:
find . -regextype egrep -regex '.*/[^/]{20,}$'
您可以通过添加以下内容来删除这些文件-delete
:
find . -regextype egrep -regex '.*/[^/]{20,}$' -print -delete
没有 GNU find
,您可以计算?
s:
find . -name '????????????????????*'
并使用以下命令删除文件-exec rm
:
find . -name '????????????????????*' -type f -print -exec rm {} +
-type f
确保这只匹配文件,并-exec rm {} +
指示一次性find
运行尽可能多的文件。rm
或者,要删除任何内容(无论类型如何),请使用
find . -name '????????????????????*' -print -exec rm -rf {} +
如果你想构造 的系列?
,你可以使用
printf '%20s*' | tr ' ' '?'
(20 个字符),因此
find . -name "$(printf '%20s*' | tr ' ' '?')" -print -exec rm -rf {} +
答案2
使用find
和Perl
,删除超过 42 个字符的文件名:
max=42
find . -print0 | perl -0sne 'unlink if length > $max' -- -max=$((max-2))
从perldoc -f unlink
:
unlink 删除文件列表。成功后,它会返回成功删除的文件数。失败时,它返回 false 并设置 $! (错误号):
小心使用!如果你不在好的目录中,你可以毁掉整个系统
前导./
需要 2 个字符。这就是为什么我-2
在 shell 中进行减法