web-dev-qa-db-ja.com

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

array=${ls -d */}
echo ${array[@]}  

wweeqqという3つのディレクトリがあります。それらを配列に入れてから、配列を印刷します。

62
Jordin Youssef

これでしょう

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

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

82
Aaron Okano

可能な限り、lsの出力を解析しないようにする必要があります( Gregの主題に関するwiki を参照)。基本的に、lsの出力は、いずれかのファイル名に面白い文字が含まれているとあいまいになります。また、通常は時間の無駄です。この場合、ls -d */を実行すると、シェルは*/をサブディレクトリのリストに展開し(既に必要なものです)、そのリストを引数としてls -dに渡します。それはディレクトリです」と表示します。 lsコマンドは何の役に立つこともしていません!

わかりました。サブディレクトリがない場合、*/はそのまま残されます。lsは「*」という名前のサブディレクトリを探しますが、見つけられず、エラーメッセージを出力します。 (stderrに)存在せず、not(* /)を(stdoutに)出力します。

サブディレクトリ名の配列を作成するよりクリーンな方法は、グロブ(*/withoutを使用してlsに渡すことです。ただし、実際のサブディレクトリがない場合に配列に「* /」が入らないようにするには、最初にnullglobを設定する必要があります(これも Greg's 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
57
Gordon Davisson

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

array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"
6
konsolebox