私はほとんど理解している簡単なスクリプトを持っています。不明確なのは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
これは私が知っているはずのドキュメントです。これを理解することができます。
-パスパターン
ファイル名はシェルパターンパターンと一致します。メタ文字は / または。を特別に扱いません。したがって、たとえば、を見つけます。 -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と比較するには:
find . -name "*.h" -execdir diff -u "{}" /tmp/master ";"
コメント
- find:pruneは指定されたパスを無視しません
- どちらかといえば' find-pathの複製 find:pruneの回答が指定されたpを無視しない場合でもath には、この質問に当てはまると思われる答えがあります。 find-path Explained の回答は、スクリプトの経験が豊富な人には意味があるかもしれませんが、'私には役立ちません。ここにある答えは、私が'調査を始めたばかりですが、これまでのところ私にはもっと理にかなっています。
回答
-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
の部分は、バックアップのバックアップを作成しないようにするために明らかに必要です…
コメント
- 私が理解している場合:findは、$ HOME / $ dir_nameを除いて、アクセスする権限を持つ$ HOME内のすべてのディレクトリを繰り返し処理します。ただし、$ HOME / $ dir_nameは、降順ではありません(プルーンアクションはtrueと評価され、または取得されません)、$ file_suffixで終わるファイルを検索します。次に、1つが見つかるとすぐに、cp " found_file.sh "を$ HOME / $ dir_nameに実行しますか?また、-pathはファイルへのパスを許可し、現在のディレクトリで作業するだけでなく、ディレクトリに移動する場合に役立ちますか?
- 理解はほぼです。正しい。
-path
は-name
と同じように機能し、ファイルを選択します。違いは、-name
がパターンをファイル名に一致させるのに対し、-path
はパターンをフルパス名に一致させることです。find
は、-maxdepth
または-prune
などによって防止されない限り、常にサブディレクトリに下降します。 - ああ!-pathは$ HOME / $ dir_name -pruneに適用され、'は私を台無しにしていたコマンドの順序であり、-pathはpruneコマンドに必要です。プルーニングされたディレクトリのフルパスと一致する必要があります。
- @Darren I 'それが'かどうかわからない非常に正確です。
-path $HOME/$dir_name
は1つのアクションです。これは、調べている現在のファイルのパスが$HOME/$dir_name
に一致するかどうかを確認するテストです。-prune
は別のアクションです。最初のコメントの最初の文は、それがどのように機能するかを正確に反映していると思います。 - パイプとして見るために何かが欠けているでしょうか? -pruneを-printに交換しましたが、フローは明確になっていると思います:find $ HOME | -パス$ HOME / $ dir_name | -print
回答
これは、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
-o
はORを意味するため、-path <some_path>
または-name *$file_suffix
-exec
はコマンドの実行を意味します。
cp {} $HOME/$dir_name/
$HOME/$dir_name/
\;
に一致するファイルをコピーする-exec
コマンドを終了します