Linux/Unix:使用一个命令即可查找和删除文件

时间:2020-01-09 10:42:16  来源:igfitidea点击:

如何在类似Linux/UNIX的操作系统下使用shell提示查找和删除所有文件(例如所有* .bak)?
有时有必要一次找出所有文件并将其删除。
但是,rm命令不支持搜索条件。
例如,找到所有* .bak文件并将其删除。
对于此类必要性,您需要使用find命令在目录中搜索文件并立即删除它们。
您可以将find和rm命令组合在一起。
本教程说明如何使用一个命令即时查找和删除文件。

使用一个命令快速查找和删除文件

查找命令的基本语法如下:

find dir-name criteria action

其中:

  • dir-name:定义工作目录,例如进入/tmp /
  • criteria:用于选择* .sh等文件
  • action:查找动作(对文件执行的操作),例如删除文件。

您要使用一个命令查找来删除多个文件,例如* .jpg或者* .sh,请尝试:

find . -name "FILE-TO-FIND" -exec rm -rf {} \;

或者

find /dir/to/search/ -type f -name "FILE-TO-FIND-Regex" -exec rm -f {} \;

上面两种语法之间的唯一区别是,第一个命令也删除目录,而第二个命令仅删除文件。
其中,选项如下:

  • -name" FILE-TO-FIND":文件模式。
  • -exec rm -rf {} \;:删除文件模式匹配的所有文件。
  • -type f:仅匹配文件,不包含目录名。
  • -type d:仅匹配目录并且不包含文件名。

现代版本的find命令也具有-delete选项。
不要使用-exec rm -rf {} \;,而是使用-delete删除所有匹配的文件。
我们还可以显式地将-depth选项传递给find,以便在目录本身之前处理每个目录的内容。
也可以使用-maxdepth选项来控制在起始点以下的大多数目录级别的降序。
例如,"-maxdepth 0"表示仅将测试和操作应用于起点本身。
类似地,我们可以将-mindepth传递给查找。
这意味着请勿以低于级别(非负整数)的级别进行任何测试或者操作。
例如,"-mindepth 1"表示处理除起点之外的所有文件。
因此,这是一个简化的语法:

find /dir/to/search/ -type f -name "FILES-TO-FIND" -delete
find /dir/to/search/ -type f -name "FILES-TO-FIND" -depth -delete
find /dir/to/search/ -maxdepth 2 -type f -name "FILES-TO-FIND" -depth -delete

find命令的示例

find命令选项如下:

  • -print0强制find命令在标准输出上打印完整文件名,后跟一个空字符(而不是-print使用的换行符)。这允许包含换行符或者其他类型的空格的文件名可以由处理查找输出的程序正确解释。此选项与xargs的-0选项相对应。

xargs命令选项如下:

  • -I {}:用从标准输入中读取的名称替换在初始参数中出现的{}。我们将{}作为arg传递给rm命令。
  • -0:输入项以空字符而不是空格终止,并且引号和反斜杠不是特殊的(每个字符均按字面意义使用)。禁用文件字符串的结尾,该字符串与其他任何参数一样对待。输入项可能包含空格,引号或者反斜杠时很有用。 GNU find -print0选项产生适合此模式的输入。
  • rm -v" {}":在匹配的文件上运行rm命令。