2017-06-12 3 views
0

スペースがあるフォルダのリストを実行しようとしています。フォルダは、bashにスペースのないフォルダ名の配列

/Volumes/SAMPLE 
/Volumes/SAMPlE 1 
/Volumes/SAMPLE 2 

などのようになります。これらのフォルダのすべてを含む配列を設定するには、私は

for ((i = 0; i < ${#dirlist[@]}; i++)) 
do 
    echo "${dirlist[$i]}"; 
done 

ような何かを実行すると、私は、私は、フォルダ名を

dirlist=(`ls -d /Volumes/*${prefix}*`); 

取得しているが、スペースは別のエントリ作成されました:

/Volumes/SAMPLE 
/Volumes/SAMPLE 
1 
/Volumes/SAMPLE 
2 
/Volumes/SAMPLE 
3 
/Volumes/SAMPLE 
4 
/Volumes/SAMPLE 
5 

アレイを分割してディレクトリの一部に含めることができないスペースについては、何が必要ですか?

ありがとうございます!

+1

関連:['ls'の結果を解析しない理由](http://mywiki.wooledge.org/ParsingLs) –

+0

また、http://wiki.bash-hackers.org/scriptingのセクションを参照してください。 /旧式の "単語分割" –

答えて

4

単にdon't use ls

dirlist=(/Volumes/*"${prefix}"*) 

例セッション:

$ cd -- "$(mktemp --directory)" 
$ touch a 'foo bar' z 
$ dirlist=(./*) 
$ printf '%s\n' "${dirlist[@]}" 
./a 
./foo bar 
./z 
+1

拡張: 'Volumes/*" $接頭辞 "*"を引用することがあります。それ以外の場合は、点をつけます。 –

+0

また、ディレクトリをフィルタリングするには、 '/ Volumes/*" $ prefix "* /'。 (OPの意図を考えれば、 'touch'ではなく' mkdir'を使うかもしれません)。 –

+0

@CharlesDuffyここで引用符を付ける必要はありませんか? –

1

は、しかし、ファイル名にスペースやディレクトリ名を含め、この

find /Volumes -maxdepth 1 -type d -name "*${prefix}*" 

のための配列を必要としないひどいやり方でありますWindowsに感染しています...

+0

名前のスペースが良いかどうかは、むしろ無関係なように見えます。*可能です*ので、堅牢ではないコードはバグがあります。 –

関連する問題