解释 find 的 -path 和 -prune 选项

解释 find 的 -path 和 -prune 选项

我有一个我最了解的简单脚本,但不清楚的是 find 命令。我有很多文档,但并不能使其更清晰。我的想法是,它的工作方式就像一个 for 循环,当前找到的文件被交换为 {} 并复制到 $HOME/$dir_name,但是如何搜索-小路-修剪-o工作?拥有如此具体且相关的文档但仍然不知道发生了什么,这很烦人。

#!/bin/bash
# The files will be search on from the user's home
# directory and can only be backed up to a directory
# within $HOME

read -p "Which file types do you want to backup " file_suffix
read -p "Which directory do you want to backup to " dir_name

# The next lines creates the directory if it does not exist
test -d $HOME/$dir_name || mkdir -m 700 $HOME/$dir_name

# The find command will copy files that match the
# search criteria ie .sh . The -path, -prune and -o
# options are to exclude the backdirectory from the
# backup.
find $HOME -path $HOME/$dir_name -prune -o \
-name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
exit 0

这只是我知道我应该能够解决这个问题的文档。

-路径模式

文件名与 shell 模式匹配。元字符不处理/或者 特别;例如,查找 . -path "./sr*sc" 将打印名为的目录的条目./src/misc(如果存在的话)。要忽略整个目录树,请使用 -prune 而不是检查树中的每个文件。例如,跳过目录src/emacs及其下的所有文件和目录,并打印找到的其他文件的名称,执行如下操作:

find . -path ./src/emacs -prune -o -print

Findutils手册

-- 操作:-exec 命令;这种不安全的变体-execdir动作由 POSIX 指定。主要区别在于该命令是在所在目录中执行的寻找被调用,意味着{}扩展为以起始目录之一的名称开头的相对路径,而不仅仅是匹配文件的基本名称。

虽然一些实现寻找更换{}仅当它在论证中单独出现时,GNU寻找取代{} 无论它出现在哪里。

例如,要将当前目录中或当前目录下的每个 C 头文件与文件 /tmp/master 进行比较:

      find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'

答案1

-path工作原理与 完全相同-name,但将该模式应用于正在检查的文件的整个路径名,而不是最后一个组件。

-prune禁止降到找到的文件下方,以防它是一个目录。

把它们放在一起,命令

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
  1. 开始在 中查找文件$HOME
  2. 如果它找到匹配的文件$HOME/$dir_name,则不会转到它下面(“修剪”子目录)。
  3. 否则 ( -o) 如果找到匹配的文件,*$file_suffix则将其复制到$HOME/$dir_name/.

$HOME这个想法似乎是在 的子目录中备份一些内容$HOME-prune为了避免备份的备份,带有 的部分显然是必要的......

答案2

它是 find 命令(-exec 语句)的一部分。

它允许您与find命令找到的文件/目录进行交互。

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;

find $HOME 表示在 $HOME 中查找文件/目录

要了解-path <some_path>,请参阅“查找路径”解释

要了解-prune,请参阅https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-sh

-o意味着 OR,所以-path <some_path>OR-name *$file_suffix

-exec表示执行命令。

cp {} $HOME/$dir_name/ 复制任何匹配的文件$HOME/$dir_name/

\;表示终止-exec命令

相关内容