0

私の知る限りfind . -maxdepth 1 -type f、フォルダ内のファイルのリストを取得する唯一の信頼できる方法です。($(find . -maxdepth 1 -type f)ただし、一部のファイルの名前にスペースが含まれている場合、このコマンドの出力をbash配列( )に単純に配置すると失敗します。

これを行う正しい方法は何ですか?

4

3 に答える 3

4

最も安全な方法は、改行を含むファイル名も正しく処理するを使用findすることです。-print0ファイルをループして配列に保存します。

declare -a arr=()
while IFS= read -r -d $'\0' f
do
    arr+=("$f")
done < <(find . -maxdepth 1 -type f -print0)

テスト:

for i in "${arr[@]}"
do
    echo "[$i]"
done
于 2012-10-02T09:44:52.143 に答える
2

これは、スペースを許可する必要があった最後の方法です。

IFS=$'\n' #Setting the Internal field separator to \n instead of \t\n
array=($(find . -maxdepth 1 -type f))
于 2012-10-02T09:53:33.780 に答える
1

あなたはこれをサイクルで行うことができます:

ARR=()
find . -maxdepth 1 -type f | while read filename; do
    ARR+=("$filename")
done

更新:残念ながら、 whileはサブプロセスで実行され、結果をエクスポートして戻す方法がないため、 whileバージョンは機能しません。

したがって、明らかにこれはforループで実行する必要があり、IFSの操作を回避する方法はありません。

正解はdogbaneです。上記の誤ったメソッドは警告として保持されます:-(

于 2012-10-02T09:48:41.813 に答える