
ディレクトリとサブディレクトリのすべてのファイルを一覧表示して配列に保存してから、いくつかの操作を実行する必要があります(デフォルトでは、配列の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)
readarray
find
各レコードを入力(ここではプロセス置換によって生成されたパイプ)に別々の要素として保存します。を使用すると、-d ''
レコード区切り文字は改行ではなくNULです。使用すると、-t
レコード区切り文字が削除されます。 bashはとにかく変数にNULを格納できないため、現在のバージョンのbashでは必要ありませんが、将来のために追加しました。
要素を繰り返すには、次のようにします。
for file in "${var[@]}"; do
something with "$file"
done
ここでは、配列の使用をスキップし、find
withの出力から直接ループすることもできます。
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
-print0
var=( **/*(ND.) )
var=( ***/*(ND.) )
4 ただし、-L
行動-follow
にも影響を与える可能性があることに注意してください-type
。一般ファイルへのシンボリックリンクは最終的にここで-type f
選択されます。 GNUを介して実装されていない限り、通常のファイルにシンボリックリンクするのではなく、withを使用してfind
通常のファイルのみを選択できます。-xtype f
-L
-type f
-L
答え2
間違いをしました。ソフトリンクを使用していましたが、使用しませんでした。探すそして-エルバナー。
original_list=()
while IFS= read -r -d $'\0'; do
original_list+=("$REPLY")
done < <(find -L ./ -type f -print0)
動作します!