ワイルドカードを使って `ls` を再帰的に実行する

ワイルドカードを使って `ls` を再帰的に実行する

特定のファイルタイプのすべてのプロジェクト ファイルを検索しようとしています:

ls -ltR *.mb

必要なファイルが複数のフォルダーにあることはわかっていますが、結果が返されません。何が間違っているのでしょうか?

答え1

lsパターンと一致しない入力引数内のファイルまたはフォルダを単純にリストします。*.mbシェルによって展開されます前にに渡されるlsため、現在のディレクトリに指定されたファイルがない場合*.mb、何も出力されません。そうでない場合は、現在のディレクトリ内のファイルのみが出力されます。

ファイルを再帰的にリストする標準的な方法は、find

find . -name '*.mb' -type f -printf "%-.22T+ %M %n %-8u %-8g %8s %Tx %.8TX %p\n" | sort | cut -f 2- -d ' '

この方法では、出力リストの形式を必要に応じてカスタマイズできます。参照:最終編集日順にファイルを一覧表示する


別の方法としてはglobstarこれは、shopt -s globstar

ls -ltR **/*.mb

最初のものは**/任意のサブディレクトリパスに一致します。次に*.mbそれらのディレクトリ内のファイルに一致します

  • グロブスター

    設定されている場合、ファイル名拡張コンテキストで使用されるパターンは、**すべてのファイルと 0 個以上のディレクトリおよびサブディレクトリに一致します。パターンの後に が続く場合は/、ディレクトリとサブディレクトリのみが一致します。

https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

答え2

@phuclv には 2 つの良いオプションがあります。同様のことをする必要がある場合、私は通常、次のように ls の出力を grep にパイプします。

ls -ltR | grep .*\.mb

これにより、ls の出力が stdout に出力される代わりに grep の入力に送信され、grep は正規表現に少なくとも 1 つ一致する行のみを出力します。

正規表現

.*\.mb

次のように説明できます。

.: match any character
*: preceding character or group should appear 0 or more times
\.mb: literally .mb

関連情報