查找和删除文件的最快方法是什么?
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
更可靠,而且 - 由于不需要管道和其他实用程序 - 也更高效。
与:
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
更可靠,而且 - 由于不需要管道和其他实用程序 - 也更高效。