BASH'i birkaç yıldır kullanırken, BASH komut dosyası oluşturma deneyimim nispeten sınırlı.
Kodum aşağıdaki gibidir. Tüm dizin yapısını geçerli dizinden almalı ve içine kopyalamalıdır $OUTDIR
.
for DIR in `find . -type d -printf "\"%P\"\040"`
do
echo mkdir -p \"${OUTPATH}${DIR}\" # Using echo for debug; working script will simply execute mkdir
echo Created $DIR
done
Sorun, benim dosya yapısı bir örnek:
$ ls
Expect The Impossible-Stellar Kart
Five Iron Frenzy - Cheeses...
Five Score and Seven Years Ago-Relient K
Hello-After Edmund
I Will Go-Starfield
Learning to Breathe-Switchfoot
MMHMM-Relient K
Boşluklara dikkat edin: -S Ve for
parametreleri kelime kelime alır, bu yüzden betiğimin çıktısı şöyle görünür:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Learning"
Created Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot"
Created Breathe-Switchfoot
Ama çıkışından tüm dosya adlarını (bir seferde bir satır) almak için buna ihtiyacım var find
. Ben de find
her dosya adı etrafında çift tırnak koymak denedim . Ama bu yardımcı olmuyor.
for DIR in `find . -type d -printf "\"%P\"\040"`
Ve bu değişen çizgi ile çıktı:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"""
Created ""
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"Learning"
Created "Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot""
Created Breathe-Switchfoot"
Şimdi, bu şekilde yineleyebileceğim bir yola ihtiyacım var, çünkü gstreamer
aşağıdaki benzer yapıdaki her dosyada daha karmaşık bir komut çalıştırmak istiyorum . Bunu nasıl yapmalıyım?
Düzenleme: Bana her dizin / dosya / döngü için birden çok kod satırı çalıştırmak sağlayacak bir kod yapısı gerekir. Belirsiz olsaydım özür dilerim.
Çözüm: Başlangıçta denedim:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
Bu çoğunlukla iyi çalıştı. Ancak, daha sonra, borunun bir alt kabukta while döngüsü ile sonuçlandığından, döngüde ayarlanan değişkenlerin daha sonra kullanılamadığını ve bu da bir hata sayacının uygulanmasını oldukça zor hale getirdiğini buldum. Son çözümüm (SO'daki bu cevaptan ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
Bu daha sonra komut dosyasında daha sonra kullanılabilecek döngü içindeki değişkenleri koşullu olarak artırmama izin verdi.
/
ve basılamaz karakterlerden. Ama dışında her şeye izin verilir /
ve \0
bu yüzden onlara izin vermelisin.