ฉันกำลังพยายามสร้าง symlinks ไปยังไดเร็กทอรีโดยอัตโนมัติ และแทนที่สตริงข้อความ (foo) ของชื่อเดิมในชื่อลิงก์ (bar) ชื่อของไดเร็กทอรีเป้าหมายอาจมีช่องว่าง (เช่น "foo with whitespace")
นี่คือตัวอย่างขั้นต่ำ:
> ls -Q
"ฟู"
"foo กับช่องว่าง"
ฉันกำลังลองใช้คำสั่งต่อไปนี้ (โดยใช้ตัวเลือก xargs' -p เพื่อดีบัก/ตรวจสอบผลลัพธ์ก่อนดำเนินการ):
หา . -ชื่อ "*foo*" -print0 | xargs -0 -I '{}' -p ln -s {} `เสียงสะท้อน {} | sed -e s#foo#bar#g
ผลลัพธ์ที่ฉันต้องการคือ:
ln -s 'foo พร้อมช่องว่าง' 'แถบที่มีช่องว่าง'
ln -s 'foo' 'บาร์'
อย่างไรก็ตาม การแทนที่สตริงล้มเหลว ผลลัพธ์จริงมีลักษณะดังนี้:
ln -s './foo พร้อมช่องว่าง' './foo พร้อมช่องว่าง'?...
ln -s ./foo ./foo?...
ถ้าฉันใช้สตริงคงที่แทน {} การแทนที่สตริงจะทำงานตามที่ต้องการ:
หา . -ชื่อ "*foo*" -print0 | xargs -0 -I '{}' -p ln -s {} `echo "foo" | sed -e s#foo#bar#g`
ln -s './foo พร้อมแถบช่องว่าง'?...
ln -s ./foo บาร์?...
ข้อผิดพลาดของฉันคืออะไรและฉันจะแก้ไขการเรียกใช้คำสั่งได้อย่างไร
แก้ไข: วิธีแก้ปัญหาของ Tilman Schmidt ทำงานเหมือนจับใจ