我有一个最容易理解的简单脚本,不清楚的是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
这只是我知道我应该能够弄清楚的文档。
路径模式
文件名与外壳模式匹配。元字符不对待/或。 特别; 因此,例如,find。-path“ ./sr*sc”将打印一个名为./src/misc的目录的条目(如果存在)。要忽略整个目录树,请使用-prune而不是检查树中的每个文件。例如,要跳过目录src / emacs及其下的所有文件和目录,并打印找到的其他文件的名称,请执行以下操作:
find . -path ./src/emacs -prune -o -print
-动作:-exec命令;-execdir操作的此不安全变体由POSIX指定。主要区别在于命令是在调用find的目录中执行的,这意味着{}会扩展到相对路径,起始路径为起始目录之一的名称,而不只是匹配文件的基本名称。
尽管一些实现的查找替换{}只有在它自身出现的说法,GNU 发现内容替换{} 凡出现。
和
例如,要将当前目录中或以下的每个C头文件与文件/ tmp / master进行比较:
find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'