find -print0 再帰

find -print0 再帰

ディレクトリとサブディレクトリのすべてのファイルを一覧表示して配列に保存してから、いくつかの操作を実行する必要があります(デフォルトでは、配列のforループとプロパティの設定)。

私は次のように始めました:

var=$(find ./ -type f)

私の問題は、ファイル名にスペースやその他のなじみのない文字(私のせいではありません!)が含まれているため、文字列の配列(findコマンドの出力など)を解析するのは非常に複雑です。

だから私は使用できることがわかりました。検索-print0再帰的でないもの(サブディレクトリではなくディレクトリのみ)として表示されることを除いて、うまく機能します。

再帰的に表示するために渡すことができるパラメータまたはそれに対応するコマンドはありますか?

  • ディレクトリとサブディレクトリのすべてのファイルを一覧表示する
  • リストを文字列配列として保存しますか?

ベストアンサー1

find常に再帰的ですが、あなたのものです。

var=$(find ./ -type f)

スカラー配列変数の代入ではなく、変数の代入です。$var最後に、文字列を含めます。find改行文字²を含む完全な出力

bash コピー zsh 構文では、配列変数の割り当ては次のようになります。

var=( 'first element' second-element etc... )

各ファイルの出力を取得するには、出力をNUL文字にfind -print0分割する必要があります。 zshではパラメータ拡張フラグをfind使用できます。0

var=( ${(0)"$(find . -type f -print0)"} )

Bashにはそれに対応するものはなく、通常はデータ構造にNULを格納することはできません。ただし、バージョン 4.4 以降、readarrayプロセス置換と組み込み機能を使用できます。

readarray -td '' var < <(find . -type f -print0)

readarrayfind各レコードを入力(ここではプロセス置換によって生成されたパイプ)に別々の要素として保存します。を使用すると、-d ''レコード区切り文字は改行ではなくNULです。使用すると、-tレコード区切り文字が削除されます。 bashはとにかく変数にNULを格納できないため、現在のバージョンのbashでは必要ありませんが、将来のために追加しました。

要素を繰り返すには、次のようにします。

for file in "${var[@]}"; do
  something with "$file"
done

ここでは、配列の使用をスキップし、findwithの出力から直接ループすることもできます。

while IFS= read -rd '' -u3 file; do
  something with "$file"
done 3< <(find . -type f -print0)

また、見ることができます検索結果を繰り返すのはなぜ悪い習慣ですか?find一般的に見つかったファイルを正しくループする方法を学びます。


-prune¹特定のディレクトリを使用または入力しないように明示的に指示しない場合、またはいくつかの-xdev実装findを使用して深さを制限しない限り-maxdepth。ただし、-Lオプションまたは-follow述語4を使用しない限り、ディレクトリへのシンボリックリンクに従わないことに注意してください。

²コマンド置換によって削除された末尾の部分は除外されます。

³まあ、では最初から非標準はzsh必要ありません。再帰的なglobおよびglob修飾子を使用するか、シンボリックリンクに従うだけです。find-print0var=( **/*(ND.) )var=( ***/*(ND.) )

4 ただし、-L行動-followにも影響を与える可能性があることに注意してください-type。一般ファイルへのシンボリックリンクは最終的にここで-type f選択されます。 GNUを介して実装されていない限り、通常のファイルにシンボリックリンクするのではなく、withを使用してfind通常のファイルのみを選択できます。-xtype f-L-type f-L

おすすめ記事