查找和删除文件的最快方法是什么?

What would be the fastest way to find and remove files?

与:

Find="$(find / -name "*.txt" )"
du -hc "$Find" | tail -n1
echo "$Find" | xargs rm -r

如果找到文件foo bar.txt,则不会用du计数或删除文件。逃离空间的最佳方法是什么?

也许 find / -name '*.txt' -exec du -hc {} \; 更符合您的要求?

但是,按照你的做法,你在调用 du 时缺少引号,并且在它不起作用时不必要地使用 xargs ......你似乎迷恋 echo,谁不是你的朋友。

由于文件名中不允许 [=15=],您可以使用其 -print0 选项安全地从 find 收集结果:

 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。

如果您的 none 个文件名可以 嵌入 换行符(这很不寻常),您可以使用以下内容:

注意:为了防止在试验命令时意外删除文件,我已将 / 替换为输入目录。 (如问题中所用)与 /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 命令任务(除了通过管道传输到 tail),这也是最可靠的选项(唯一需要注意的是,如果您有太多文件以至于它们不适合单个命令行,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 更可靠,而且 - 由于不需要管道和其他实用程序 - 也更高效。