web-dev-qa-db-ja.com

ワイルドカードを使用して `ls`を再帰的に実行します

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

ls -ltR *.mb

必要なファイルがいくつかのフォルダーにあることはわかっていますが、結果が返されません。私は何を間違えましたか?

1
whatIsLife

lsがパターンと一致しません。入力引数にファイルまたはフォルダーをリストするだけです。 *.mblsに渡される前にシェルによって展開されるため、現在のディレクトリに*.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をそれらのディレクトリ内のファイルと一致させます

  • globstar

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

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

6
phuclv

@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
0
user248983