使用:
abort
如果找到文件Find="$(find / -name "*.txt" )"
du -hc "$Find" | tail -n1
echo "$Find" | xargs rm -r
,则不会使用du计算它或删除文件。什么是逃离空间的最佳方式?
答案 0 :(得分:2)
如果您的文件名都没有嵌入换行符(这可能非常不寻常),您可以使用以下内容:
注意:为了防止在尝试使用命令时意外删除文件,我将/
替换为输入目录。 (在问题中使用)与/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
的管道更强大,而且 - 由于不需要管道和其他实用程序 - 也更有效。
答案 1 :(得分:0)
或许find / -name '*.txt' -exec du -hc {} \;
更像是您正在寻找的内容?
但是,按照您的方式执行此操作,您在du
的通话中错过了引号,并且当它无法工作时不必要地使用xargs
......您似乎迷恋{ {1}},谁不是你的朋友。
由于文件名中不允许echo
,因此您可以使用\0
选项安全地从find
收集结果:
-print0
已更正现在可以在MacOS和Linux上运行。