ในขณะที่ฉันใช้ BASH มาหลายปีประสบการณ์ของฉันกับการเขียนสคริปต์ BASH ค่อนข้าง จำกัด
รหัสของฉันเป็นดังนี้ $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
ปัญหาคือนี่คือตัวอย่างของโครงสร้างไฟล์ของฉัน:
$ 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
สังเกตช่องว่าง: -S และfor
รับพารามิเตอร์ทีละคำดังนั้นเอาต์พุตของสคริปต์ของฉันจะเป็นดังนี้:
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
แต่ผมต้องการที่จะคว้าทั้งชื่อไฟล์ (หนึ่งบรรทัดในเวลา) find
จากการส่งออกของ ฉันได้ลองfind
ใส่เครื่องหมายคำพูดคู่รอบชื่อไฟล์แต่ละรายการ แต่มันก็ไม่ได้ช่วยอะไร
for DIR in `find . -type d -printf "\"%P\"\040"`
และเอาต์พุตด้วยบรรทัดที่เปลี่ยนแปลงนี้:
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"
ตอนนี้ฉันต้องการวิธีที่ฉันสามารถทำซ้ำผ่านเช่นนี้เพราะฉันต้องการเรียกใช้คำสั่งที่ซับซ้อนมากขึ้นที่เกี่ยวข้องgstreamer
กับแต่ละไฟล์ในโครงสร้างที่คล้ายกันดังต่อไปนี้ ฉันจะทำสิ่งนี้ได้อย่างไร
แก้ไข:ฉันต้องการโครงสร้างโค้ดที่จะอนุญาตให้ฉันรันโค้ดหลายบรรทัดสำหรับแต่ละไดเร็กทอรี / ไฟล์ / ลูป ขออภัยถ้าฉันไม่ชัดเจน
วิธีแก้ปัญหา:ฉันพยายามครั้งแรก:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
มันใช้งานได้ดีสำหรับส่วนใหญ่ อย่างไรก็ตามในภายหลังฉันพบว่าเนื่องจากไพพ์ส่งผลให้ขณะที่ลูปทำงานใน subshell ตัวแปรใด ๆ ที่ตั้งค่าในลูปไม่พร้อมใช้งานในภายหลังซึ่งทำให้การใช้ตัวนับข้อผิดพลาดค่อนข้างยาก ทางออกสุดท้ายของฉัน (จากคำตอบนี้บน SO ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
ซึ่งภายหลังทำให้ฉันสามารถเพิ่มตัวแปรตามเงื่อนไขภายในลูปซึ่งจะคงอยู่ในสคริปต์ต่อไป
/
ตัวอักษรที่ไม่สามารถพิมพ์ได้ แต่สิ่งใดก็ตามที่ได้รับอนุญาตยกเว้น/
และ\0
ดังนั้นคุณต้องอนุญาต