私が理解している簡単なスクリプトがあります。はっきりしないのは、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
これは、これを理解できるはずのドキュメントです。
-パスパターン
ファイル名がシェルパターンpatternと一致します。メタキャラクターは/またはを扱いません。 特に; たとえば、を見つけます。-path "./sr*sc"は、。/ src / misc(存在する場合)というディレクトリのエントリを出力します。ディレクトリツリー全体を無視するには、ツリー内のすべてのファイルをチェックするのではなく、-pruneを使用します。たとえば、ディレクトリsrc / emacsとその下のすべてのファイルとディレクトリをスキップし、見つかった他のファイルの名前を出力するには、次のようにします。
find . -path ./src/emacs -prune -o -print
-アクション:-execコマンド; この安全でない-execdirアクションの変形は、POSIXで指定されています。主な違いは、コマンドがfindが呼び出されたディレクトリで実行されることです。つまり、{}は、一致したファイルのベース名だけではなく、開始ディレクトリの1つの名前で始まる相対パスに展開されます。
いくつかの実装ながら検索を置き換える{}それは、引数で独自に表示される場合にのみ、GNUは見つける置き換えを{} が表示されたところはどこでも。
そして
たとえば、現在のディレクトリ以下の各Cヘッダーファイルをファイル/ tmp / masterと比較するには、次のように入力します。
find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'