現在、ディレクトリ内の一部のファイルを処理するスクリプトを作成しています。最初の例では find コマンドを使用し、ディレクトリを引数として渡します。 2番目の方法では、 find コマンドに -name スイッチを使用して目的のファイル名を渡しました。しかし、誰かが次の2つの違いを私に説明できますか?なぜなら、それらはまったく同じ出力を生成するからです。
find dump* -type f -mtime +5 | xargs ls -ltrh
find $dir -type f -name "dump*" -mtime +5 | xargs ls -ltrh
上記の例では、ファイルが含まれているディレクトリで実行されているとします。しかし、2番目のケースではどこでも実行できます。私の主な関心事はファイルパスと名前の部分なので、可能であればそれに集中してください。
この質問が以前にリクエストされた場合は申し訳ありません。探してみましたが、何も見つかりませんでした。
ありがとうございます。
答え1
最初のケースでは、dump*
シェルによって解釈され、ファイル名と一致するように拡張され、次に渡されますfind
。find
find dumpa dumpb ... -type f ...
2番目のケースでは、シェルは解釈を実行しません。find
フィルタリングします。したがって、の再帰的性質を考慮すると、find
2番目の方法は最初の方法で見逃したファイルを見つけることができます。
-name
2番目のアプローチは、変数を使用して設定/フィルタリングできるため、より柔軟ですが-path
取得がより困難です。シェル拡張ワイルドカード変数から。ユースケースに応じて、そのうちの1つは正確ですが、すべての場合において、2番目のものは最初のものと一致するように変更できます(、またはfind
他のオプションを使用)。しかし、その逆は不可能です。maxdepth
prune
考慮する:
$ tree .
.
├── dumpa
│ └── dumpc
├── dumpb
├── dumpd
└── not-dump
└── dumpe
$ find . -type f -name 'dump*'
./not-dump/dumpe
./dumpd
./dumpa/dumpc
$ find dump* -type f
dumpa/dumpc
dumpd
また、最初のものはワイルドカードに一致するものがないとエラーが発生しますが、2番目は結果なしで成功します。
$ find blahblah* -type f
find: `blahblah*': No such file or directory
$ find . -name 'blahblah*' -type f
$
私は次の理由で2番目のアプローチを好みます。
- より柔軟です。
- エラーが発生しやすい。一致するものがない場合にワイルドカードを使用すると、問題が発生する可能性があります。可能であれば、特に
find
そのようなツールがあれば、ワイルドカードのシェル拡張を避けることができます。
別の無関係なことがあります。スキップしてくださいxargs
。
find ... -exec ls -lrth {} +