我有一个我最了解的简单脚本,但不清楚的是 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
-- 操作:-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/ \;
- 开始在 中查找文件
$HOME
。 - 如果它找到匹配的文件
$HOME/$dir_name
,则不会转到它下面(“修剪”子目录)。 - 否则 (
-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
命令