検索コマンド:ファイルパスと-nameパラメータ

検索コマンド:ファイルパスと-nameパラメータ

現在、ディレクトリ内の一部のファイルを処理するスクリプトを作成しています。最初の例では 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*シェルによって解釈され、ファイル名と一致するように拡張され、次に渡されますfindfind

find dumpa dumpb ... -type f ...

2番目のケースでは、シェルは解釈を実行しません。findフィルタリングします。したがって、の再帰的性質を考慮すると、find2番目の方法は最初の方法で見逃したファイルを見つけることができます。

-name2番目のアプローチは、変数を使用して設定/フィルタリングできるため、より柔軟ですが-path取得がより困難です。シェル拡張ワイルドカード変数から。ユースケースに応じて、そのうちの1つは正確ですが、すべての場合において、2番目のものは最初のものと一致するように変更できます(、またはfind他のオプションを使用)。しかし、その逆は不可能です。maxdepthprune

考慮する:

$ 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番目のアプローチを好みます。

  1. より柔軟です。
  2. エラーが発生しやすい。一致するものがない場合にワイルドカードを使用すると、問題が発生する可能性があります。可能であれば、特にfindそのようなツールがあれば、ワイルドカードのシェル拡張を避けることができます。

別の無関係なことがあります。スキップしてくださいxargs

find ... -exec ls -lrth {} +

関連情報