array=${ls -d */}
echo ${array[@]}
私は3つのディレクトリを持っています:ww
ee
qq
。それらを配列に入れてから、配列を出力します。
回答:
これだろう
array=($(ls -d */))
編集:より一般的な答えについては、Gordon Davissonのソリューションを参照してください(つまり、ファイル名に特殊文字が含まれている場合)。この答えは、構文の修正にすぎません。
ARR+=('$(ls -d */)')
して配列内の要素を編集し、一重引用符を使用して特殊文字を処理し、それに要素を追加または削除しますアレイ。一重引用符はリテラル文字を保持し、ディレクトリ名でそれらを処理するためのエスケープの必要性を排除します。
declare -a ARR; ARR+=('$(ls -d "$INPUT_DIR"/*)')
戻り値のみ$(ls -d $INPUT_DIR/*)
ARR+=("$(ls -d */)")
動作するはずです。そうでなければ私に知らせてください。
可能な限り、の出力を解析しないようにする必要があります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
/
dir名にを含めたくない場合はどうなりますか?
ls
簡単なコマンドです。出力は文字列です。Bashは、文字列の解析に非常に優れています。適切な正規表現は、ls
出力を安全に解析するために必要なすべてです。
ls
ば、ファイル名に面白い文字や印刷されない文字が含まれるため、出力をファイル名のリストに解析する一貫した方法はありません。そして、私が言ったように、それは実際には何の役にもls -d */
立ちません。の出力を正しく解析すると、直接得られるものとまったく同じものになります*/
(一致するものがない場合を除いて、それは簡単に確認できます)。
A lazy sysadmin is a good sysadmin.
おそらく私自身のls
解析は、私が持っているバージョン、または私が慣れているバージョンに固有ですが、これまでのところ、テストしたLinuxディストリビューションでは問題はありませんでした。私は経験からしか話すことができません。
これにより、これらのディレクトリ内のファイルが1行ずつ出力されます。
array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"