Score:0

การแทนที่สตริงล้มเหลวในคำสั่ง xargs

ธง tr

ฉันกำลังพยายามสร้าง 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 ทำงานเหมือนจับใจ

Score:1
ธง bd

การแทนที่คำสั่ง

`ก้อง {} | sed -e s#foo#bar#g`

ดำเนินการเพียงครั้งเดียว ก่อน ท่อส่งประกอบด้วย หา และ xargs คำสั่งถูกเรียกใช้ ดังนั้น เสด รับสตริง {} เป็นอินพุตและไม่พบ ฟู, เอาต์พุตไม่เปลี่ยนแปลง แล้ว เชลล์รันบรรทัดคำสั่งที่เป็นผลลัพธ์

หา . -ชื่อ "*foo*" -print0 | xargs -0 -I '{}' -p ln -s {} {}

ดังนั้นการแทนที่คำสั่งจึงเป็นเครื่องมือที่ไม่ถูกต้อง ลองอะไรซักอย่าง

หา . -ชื่อ "*foo*" -print | ในขณะที่อ่าน f; ทำ ln -s "$f" "${f//foo/bar}"; เสร็จแล้ว

(ยังไม่ทดลอง) แทน โปรดทราบว่าสิ่งนี้จะไม่ทำงานหากคุณมีชื่อไฟล์ที่มีการขึ้นบรรทัดใหม่

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา