findの-pathおよび-pruneオプションについて説明する


11

私が理解している簡単なスクリプトがあります。はっきりしないのは、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

Findutilsマニュアルから

-アクション:-execコマンド; この安全でない-execdirアクションの変形は、POSIXで指定されています。主な違いは、コマンドがfindが呼び出されたディレクトリで実行されることです。つまり、{}は、一致したファイルのベース名だけではなく、開始ディレクトリの1つの名前で始まる相対パスに展開されます。

いくつかの実装ながら検索を置き換える{}それは、引数で独自に表示される場合にのみ、GNUは見つける置き換えを{} が表示されたところはどこでも。

そして

たとえば、現在のディレクトリ以下の各Cヘッダーファイルをファイル/ tmp / masterと比較するには、次のように入力します。

      find . -name '*.h' -execdir diff -u '{}' /tmp/master ';'


私はそれがの重複だどちらかといえばと思う説明検索パスに答えても、プルーンは、指定されたパスを無視していません:検索がこの質問に適用するように思われる答えを持っています。たぶん、パスの説明で説明された答えは、スクリプトの経験が豊富な人には理にかなっていますが、私には役に立ちません。私がそれらを調べ始めたばかりですが、ここにある答えは、これまでのところ私にはより理にかなっています。
flerb 2017

回答:


23

-pathは、とまったく同じよう-nameに機能しますが、最後のコンポーネントではなく、検査中のファイルのパス名全体にパターンを適用します。

-prune ディレクトリの場合、見つかったファイルの下に降りることを禁止します。

すべてをまとめると、コマンド

find $HOME -path $HOME/$dir_name -prune -o -name "*$file_suffix" -exec cp {} $HOME/$dir_name/ \;
  1. でファイルの検索を開始します$HOME
  2. 一致するファイルが見つかった場合、その$HOME/$dir_name下には移動しません(サブディレクトリを「プルーニング」します)。
  3. それ以外の場合(-o)一致するファイルが見つかった場合は、に*$file_suffixコピーし$HOME/$dir_name/ます。

アイデア$HOMEは、のサブディレクトリにあるのコンテンツの一部をバックアップすることです$HOME。の部分-pruneは、バックアップのバックアップを作成しないようにするために明らかに必要です...


私が理解している場合:findは、$ HOME / $ dir_nameを除き、$ HOME / $ dir_nameを除く、$ HOME内のすべてのディレクトリを反復処理します(プルーンアクションはtrueと評価され、取得されません)、$ file_suffixで終わるファイルを検索します。それが見つかると、cp "found_file.sh"を$ HOME / $ dir_nameに実行しますか?また、-pathはファイルへのパスを許可し、現在のディレクトリで作業するだけでなく、ディレクトリに降りたい場合に役立ちます。
flerb 2017

あなたの理解はほぼ正しいです。-path同様に-name機能します:ファイルを選択します。違いは-name、パターンをファイル名に-path一致させるのに対し、パターンを完全パス名に一致させることです。find防止されない限り、常に、サブディレクトリに下降-maxdepth又は-prune
AlexP

ああ!-pathが$ HOME / $ dir_name -pruneに適用されている場合、それは私を混乱させるコマンドの順序であり、-pathはプルーニングされたディレクトリの完全パスと一致する必要があるため、pruneコマンドに必要です。
flerb 2017

@ダーレンそれがかなり正確かどうかはわかりません。-path $HOME/$dir_name1つのアクションです。これは、調査中の現在のファイルのパスが何とでも一致するかどうかをチェックするテスト$HOME/$dir_nameです。-prune別のアクションです。最初のコメントの最初の文は、それがどのように機能するかを正確に反映していると思います。
David Z

それをパイプとして見るために何かが欠けていますか?私は-pruneを-printと交換し、フローが明確になったと思います:find $ HOME | -path $ HOME / $ dir_name | -print
flerb 2017

4

これは、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には、https://stackoverflow.com/questions/1489277/how-to-use-prune-option-of-find-in-shを参照してください

-oORを意味するため、-path <some_path>OR-name *$file_suffix

-exec コマンドを実行することを意味します。

cp {} $HOME/$dir_name/ に一致するファイルをコピーする $HOME/$dir_name/

\;-execコマンドを終了することを意味します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.