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

时间:2016-02-04 21:14:43

标签: bash find-util

使用:

abort

如果找到文件Find="$(find / -name "*.txt" )" du -hc "$Find" | tail -n1 echo "$Find" | xargs rm -r ,则不会使用du计算它或删除文件。什么是逃离空间的最佳方式?

2 个答案:

答案 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上运行。