我有一个我理解大部分的简单脚本,它是 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
-- 操作:-exec 命令;-execdir操作的这种不安全变体由 POSIX 指定。主要区别在于命令在调用find的目录中执行,这意味着{}被扩展为以起始目录之一的名称开头的相对路径,而不仅仅是匹配文件的基本名称。
虽然find 的某些实现仅替换参数中单独出现的{},但 GNU find替换{} 出现的任何位置。
和
例如,要将当前目录中或以下的每个 C 头文件与文件 /tmp/master 进行比较:
Run Code Online (Sandbox Code Playgroud)find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'
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)
$HOME
.$HOME/$dir_name
它就不会在它下面(“修剪”子目录)。-o
) 如果找到匹配的文件,则将其*$file_suffix
复制到$HOME/$dir_name/
.这个想法似乎是使一些内容的备份$HOME
中的子目录$HOME
。-prune
为了避免备份备份,这些部分显然是必要的......
它是 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
命令