LSからの出力をキャプチャするか、すべてのファイル名を配列に保存するコマンドを見つけてください。

StackOverflow https://stackoverflow.com/questions/4678418

質問

現在のディレクトリのファイルを一度に1つずつ処理する必要があります。私はの出力を取る方法を探しています ls また find 結果の値を配列の要素として保存します。これにより、必要に応じて配列要素を操作できます。

役に立ちましたか?

解決

正確な質問に答えるには、以下を使用してください。

arr=( $(find /path/to/toplevel/dir -type f) )

$ find . -type f
./test1.txt
./test2.txt
./test3.txt
$ arr=( $(find . -type f) )
$ echo ${#arr[@]}
3
$ echo ${arr[@]}
./test1.txt ./test2.txt ./test3.txt
$ echo ${arr[0]}
./test1.txt

ただし、一度に1つずつファイルを処理したい場合は、使用できます find's -exec スクリプトがやや単純である場合、またはそのような返品を見つけるものをループすることができる場合:

while IFS= read -r -d $'\0' file; do
  # stuff with "$file" here
done < <(find /path/to/toplevel/dir -type f -print0)

他のヒント

for i in `ls`; do echo $i; done;

それよりも簡単になることはできません!

編集:うーん - デニス・ウィリアムソンのコメントによると、できるようです!

編集2:OPは、の出力を解析する方法を具体的に尋ねますが ls, 、以下のコメンテーターが言ったように、正しい答えは「あなたはそうしない」と指摘したかっただけです。使用する for i in * 代わりに同様です。

実際、現在のディレクトリのファイルにLS/Findを使用する必要はありません。

for loopを使用するだけです。

for files in *; do 
    if [ -f "$files" ]; then
        # do something
    fi
done

また、非表示ファイルも処理する場合は、相対オプションを設定できます。

shopt -s dotglob

この最後のコマンドはBashのみで機能します。

やりたいことによっては、Xargsを使用できます。

ls directory | xargs cp -v dir2

例えば。 Xargsは返された各アイテムに行動します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top