Linux Bashでlsを配列に割り当てるにはどうすればよいですか?


回答:


109

これだろう

array=($(ls -d */))

編集:より一般的な答えについては、Gordon Davissonのソリューションを参照してください(つまり、ファイル名に特殊文字が含まれている場合)。この答えは、構文の修正にすぎません。


14
ディレクトリ名にスペースが含まれている場合、これは正しく機能しません。
chepner 2013

1
スペースまたは特殊文字の問題を解決するには、最初に値なしで配列を宣言してから、組み込みを使用ARR+=('$(ls -d */)')して配列内の要素を編集し、一重引用符を使用して特殊文字を処理し、それに要素を追加または削除しますアレイ。一重引用符はリテラル文字を保持し、ディレクトリ名でそれらを処理するためのエスケープの必要性を排除します。
妖怪

@Yokaiあなたの提案は素晴らしいように聞こえますが、Ubuntu16.04またはMacOではうまくいきませんでした。Bashは、次のように一重引用符の間でコードを展開します。declare -a ARR; ARR+=('$(ls -d "$INPUT_DIR"/*)')戻り値のみ$(ls -d $INPUT_DIR/*)
AgileBean18年

1
私の間違い。コマンド置換を拡張できるように、これは二重引用符である必要があります。ARR+=("$(ls -d */)")動作するはずです。そうでなければ私に知らせてください。
妖怪

2
@Yokai、ディレクトリごとに1つの要素ではなく、合計1つの要素(改行の束を含む)のみを追加します。
チャールズ・ダフィー

76

可能な限り、の出力を解析しないようにする必要がありますls件名についてはGregのwikiを参照してください)。基本的lsに、ファイル名のいずれかに面白い文字が含まれていると、の出力はあいまいになります。また、通常は時間の無駄です。この場合、を実行するls -d */と、シェル*/がサブディレクトリのリストに展開され(これはすでに必要なものです)、そのリストを引数としてに渡しls -d、それぞれを調べて、「はい、それはディレクトリです」と言います。大丈夫」と印刷します(一貫性がなく、場合によってはあいまいな形式で)。このlsコマンドは何の役にも立ちません!

さて、それは便利なことを1つ実行しています。サブディレクトリがない場合はその*/ままにし、ls「*」という名前のサブディレクトリを探しますが、見つからない場合は、存在しないというエラーメッセージを出力します( stderr)、および「* /」を(stdoutに)出力しません

サブディレクトリ名の配列を作成するためのよりクリーンな方法は、glob(*/をに渡さに使用することlsです。ただし、実際のサブディレクトリがない場合に配列に「* /」を入れないようにするには、最初にnullglobを設定する必要があります(ここでも、Gregのwikiを参照してください)。

shopt -s nullglob
array=(*/)
shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later
echo "${array[@]}"  # Note double-quotes to avoid extra parsing of funny characters in filenames

サブディレクトリがない場合にエラーメッセージを出力する場合は、自分で行うことをお勧めします。

if (( ${#array[@]} == 0 )); then
    echo "No subdirectories found" >&2
fi

2
コメントありがとうございます。回答としてマークされていませんが、非常に有益であり、感謝しています。
ジェイクH

/dir名にを含めたくない場合はどうなりますか?
慎三

gregのwikiで概説されている問題/問題は、単なる条件付き構成では簡単に処理できないものではありません。ls簡単なコマンドです。出力は文字列です。Bashは、文字列の解析に非常に優れています。適切な正規表現は、ls出力を安全に解析するために必要なすべてです。
妖怪

@Yokaiのバージョンが異なれlsば、ファイル名に面白い文字や印刷されない文字が含まれるため、出力をファイル名のリストに解析する一貫した方法はありません。そして、私が言ったように、それは実際には何の役にもls -d */立ちません。の出力を正しく解析すると、直接得られるものとまったく同じものになります*/(一致するものがない場合を除いて、それは簡単に確認できます)。
ゴードンデイヴィソン2017年

要約すると、A lazy sysadmin is a good sysadmin.おそらく私自身のls解析は、私が持っているバージョン、または私が慣れているバージョンに固有ですが、これまでのところ、テストしたLinuxディストリビューションでは問題はありませんでした。私は経験からしか話すことができません。
妖怪

7

これにより、これらのディレクトリ内のファイルが1行ずつ出力されます。

array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.