解释 find 的 -path 和 -prune 选项

fle*_*erb 21 find

我有一个我理解大部分的简单脚本,它是 find 命令不清楚。我有很多文档,但它并不能使它更清晰。我的想法是它像 for 循环一样工作,当前找到的文件被换入 {} 并复制到 $HOME/$dir_name,但是-path-prune -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
Run Code Online (Sandbox Code Playgroud)

这只是我知道我应该能够从中弄清楚的文档。

-路径模式

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

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

来自Findutils 手册

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

虽然find 的某些实现仅替换参数中单独出现的{},但 GNU find替换{} 出现的任何位置。

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

      find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'
Run Code Online (Sandbox Code Playgroud)

Ale*_*exP 40

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

-prune 禁止低于找到的文件,以防它是一个目录。

把它们放在一起,命令

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

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


the*_*rpy 7

它是 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>,请参阅解释“find -path”

要了解-prune,请参阅/sf/ask/104249421/

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

-exec 表示执行命令。

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

\;意味着终止-exec命令