find コマンドのドットとアスタリスクの違い

find コマンドのドットとアスタリスクの違い

カスタムLinuxオペレーティングシステムがインストールされているSynology NASがあります。このfindコマンドを使用して、約25日間変更された特定のディレクトリのファイルのリストを一覧表示しました(一部のファイルは除外)。

後で「。」代わりに「*」を使用するとfind結果が異なるようです。以下のコマンドを参照してください。

find . ! -path "*@eaDir*" -type f ! -iname ".DS_Store" ! -iname "Thumbs.db" -mtime -25

find * ! -path "*@eaDir*" -type f ! -iname ".DS_Store" ! -iname "Thumbs.db" -mtime -25

「.」を使うと一部かなり時間が経過すると出力されます。 「.」を「*」に置き換えるともっと結果は非常に高速で、「.」を使用する場合とは異なります。

ls -al「*」を使用した結果が正しいこと、つまりファイルの変更日時が過去25日以内であることを確認したことがあります。

なぜ結果が違うのか教えてくれる人はいますか?

ベストアンサー1

存在する:

find * ...

シェルコマンドラインとして、シェル*によって現在のディレクトリに隠されていない項目の(語彙的にソートされた)リストに展開されたglob*だけです)。数値)。

したがって、現在のディレクトリに次のエントリが含まれている場合:

  • .
  • ..
  • .htaccess
  • file.txt
  • -foo-

findfind、、、-foo-file.txtおよび)パラメータを使用して呼び出されます...。これが誤ったオプションまたは述部であると文句をfind言うかもしれません。-foo-

以下を使用する場合でも:

find -- * ...

-anything検索を停止するオプション(例えば、、)のみを指定し、述部を指定しないため、or!または...という名前の(ファイルでは正しく機能しません。--find-L-H

あなたが使用できる:

find ./* ...

問題を回避するために、隠しファイルを無視し、誤った文字や割り込みを持つファイルを無視することもできます(使用引数のリストが長すぎます。)現在のディレクトリにファイルが多い場合。

そして:

find . ...

.を渡すと現在のディレクトリfindになります。.その後、findシェルはその中にあるファイルを繰り返し探します(深さ0のファイルを除くすべての.項目(他の隠し項目を含む)、およびサブディレクトリ内の他のすべての項目(まだおよび除外))。......

あなたはちょうど次を使用したいと思います:

find ./* ...

深さ1(深さ1のみ)のファイルのリストを並べ替え、深さ1(深さ1のみ)の隠しファイルを除外する場合。そうは思えません。

隠しファイルを除外するには、! -name '.*'Orを追加します(もちろん、間違った文字を含むファイル名に注意してください。パターンに一致する最上位ディレクトリも含まれます-name '[!.]*')。find .

各レベルでソートするには、zsh再帰ワイルドカードにglob修飾子を使用する必要があります。

他の結果が得られる理由は、find *findが最初に現在のディレクトリの最初のファイルまたはディレクトリを見つけるように指示されたためである可能性があります。アルファベット順、そしてを使用してそれ自体を見てから、別の順序でその中にある最初のファイルまたはディレクトリをfind .調べます.(おそらくエントリはディレクトリに格納されている順序かもしれませんが、いくつかのfind実装ではディスクヘッドの検索を最小限に抑えるためにinode番号でリストをソートします。することもあります)。 )。

しかし、コマンドを書くより良い方法は次のとおりです。

find . \( -name @eaDir -o -iname .DS_Store -o -iname Thumbs.db \) \
  -prune -o -mtime -25 -type f -print

これはfind、そのディレクトリとその内容を完全に無視することを意味します(その中を覗き込もうとしません)。

おすすめ記事