私の知る限りfind . -maxdepth 1 -type f
、フォルダ内のファイルのリストを取得する唯一の信頼できる方法です。($(find . -maxdepth 1 -type f)
ただし、一部のファイルの名前にスペースが含まれている場合、このコマンドの出力をbash配列( )に単純に配置すると失敗します。
これを行う正しい方法は何ですか?
最も安全な方法は、改行を含むファイル名も正しく処理するを使用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
これは、スペースを許可する必要があった最後の方法です。
IFS=$'\n' #Setting the Internal field separator to \n instead of \t\n
array=($(find . -maxdepth 1 -type f))
あなたはこれをサイクルで行うことができます:
ARR=()
find . -maxdepth 1 -type f | while read filename; do
ARR+=("$filename")
done
更新:残念ながら、 whileはサブプロセスで実行され、結果をエクスポートして戻す方法がないため、 whileバージョンは機能しません。
したがって、明らかにこれはforループで実行する必要があり、IFSの操作を回避する方法はありません。
正解はdogbaneです。上記の誤ったメソッドは警告として保持されます:-(