Belirli bir dizinin tüm alt dizinlerinde (ancak dosyalarında değil) döngü yapan bir bash kabuk betiğim var. Sorun, bazı dizin adlarının boşluk içermesidir.
İşte test rehberimin içeriği:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
Ve dizinlerde dolaşan kod:
for f in `find test/* -type d`; do
echo $f
done
İşte çıktı:
Test / Baltimore Test / Kiraz Tepe Test / Edison Test / Yeni York Kent Test / Philadelphia
Cherry Hill ve New York City, 2 veya 3 ayrı giriş olarak değerlendirilir.
Dosya adlarından alıntı yapmayı denedim, şöyle:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
ama boşuna.
Bunu yapmanın basit bir yolu olmalı.
Aşağıdaki cevaplar harika. Ancak bunu daha karmaşık hale getirmek için - her zaman test dizinimde listelenen dizinleri kullanmak istemiyorum. Bazen dizin adlarını bunun yerine komut satırı parametreleri olarak geçirmek istiyorum.
Charles'ın IFS'yi kurma önerisini aldım ve şunu buldum:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
ve bu, komut satırı argümanlarında boşluk olmadıkça (bu argümanlar alıntılanmış olsa bile) gayet iyi çalışır. Örneğin, komut dosyasını test.sh "Cherry Hill" "New York City"
şu şekilde çağırmak: aşağıdaki çıktıyı üretir:
Kiraz Tepe Yeni York Kent
list="$@"
orijinal değerin listesini tamamen atarak onu bir dizeye daraltır. Lütfen cevabımdaki uygulamaları aynen verildiği gibi takip edin - böyle bir görev burada hiçbir yerde teşvik edilmemektedir; Bir programa komut satırı bağımsız değişkenlerinin bir listesini iletmek istiyorsanız, bunları bir dizide toplamanız ve bu diziyi doğrudan genişletmeniz gerekir.