什么是最快的方式来查找和删除文件?
Find="$(find/-name "*.txt")"
du -hc "$Find" | tail -n1
echo "$Find" | xargs rm -r
如果找到该文件foo bar.txt
,它不会与杜计或删除该文件。什么是摆脱空间的最佳方式?
如果没有你的文件名可以有嵌入式换行(这将是非常不寻常的),你可以使用以下命令:
注:为了防止文件被意外删除,同时与命令实验,我已将输入目录替换为/
。 (在问题中使用)与/foo
。
# Read all filenames into a Bash array; embedded spaces in
# filenames are handled correctly.
IFS=$'\n' read -d '' -ra files < <(find /foo -name "*.txt")
# Run the `du` command:
du -hc "${files[@]}" | tail -1
# Delete the files.
rm -r "${files[@]}"
需要注意的是,如果你没有必要提前收集所有的文件名,不介意运行find
两次,你可以使用一个find
命令为每个任务(除管道到这也是最强大的选项(唯一的警告是,如果你有太多的文件,他们不适合在一个命令行上,du
可能会被调用多个次)。
# The `du` command
find /foo -name "*.txt" -exec du -hc {} + | tail -n1
# Deletion.
# Note that both GNU and BSD `find` support the `-delete` primary,
# which supports deleting both files and directories.
# However, `-delete` is not POSIX-compliant (a POSIX-compliant alternative is to
# use `-exec rm -r {} +`).
find /foo -name "*.txt" -delete
使用+
终止传递给-exec
命令是至关重要的,因为它指示 find
传递尽可能多的匹配,而将适合的单个命令行到目标命令上;通常但不一定,这会导致调用单个;有效-exec ... +
就像内置xargs
一样,除了参数中嵌入的空格是而不是的一个问题。
换句话说:-exec ... +
不仅比管道配管xargs
更稳健,而且 - 由于不需要管道和其他公用设施 - 也更高效。
我同意嵌入换行符很少见,但面对它们时脆弱的方法是什么?目标是否与POSIX兼容? –
@CharlesDuffy:独立的'find'命令可以避免嵌入的换行问题,其方式可以在您对问题的有用评论中提出(尽管无法保证'du'的_single_调用)。否则,它是便利/效率和涵盖所有边缘案例之间的折衷。你能想到一个完全可靠的方法来收集所有文件名,没有循环,没有涉及临时文件? – mklement0
也许find/-name '*.txt' -exec du -hc {} \;
更像是你要找的东西?
但是,这样做的你做,你错过了你的通话引号du
,并不必要使用xargs
时将无法正常工作......你似乎迷恋echo
,谁是不是你的朋友。
由于\0
没有在文件名中不允许,你可以安全地从find
使用其-print0
选项收集结果:
date > /private/var/mobile/Documents/Local\ Cookies/Clean
find . -print0 | while IFS='' read -r -d '' file
do
du -hc "$file" | tail -n 1
rm "$file"
done
更正应该在MacOS和Linux现在的工作。
要使'du -hc'按预期工作(报告_total_大小),您必须将_all_文件名传递给它;因此:'-exec du -hc {} +'。 – mklement0
您的循环解决方案除了效率低下之外,还存在相同的问题:在_individual_文件上调用du -hc并不是OP所期望的。另外,你可能忘了在'rm'命令之前删除'xargs'。 – mklement0
对,剪切粘贴错误。而且......是的,我可以用任何方式来解释这个意图,就像'du'一样。 'rm -r'让我感到困惑,除非有人拥有名为* .txt的目录? – BRFennPocock
将'IFS'设置为换行符,以便变量扩展中的空格不会用作单词分隔符。 – Barmar
'find -delete'是最快的; [看到这个](http://stackoverflow.com/questions/33488712/delete-nested-hidden-files-with-egrep-and-xargs/33488763#33488763)。 – Kenney
@Cyrus:感谢您清理其他评论,但如果您想保留shellcheck.net评论,请_recreate it_说明_it不再直接适用_,并且您只是简单地推荐shellcheck.net作为一个有用的资源。 – mklement0