ฉันต้องการไพพ์ชื่อไฟล์ไปยังโปรแกรมอื่น แต่พวกมันทั้งหมดทำให้หายใจไม่ออกเมื่อชื่อมีช่องว่าง
สมมติว่าฉันมีไฟล์ที่เรียกว่า
foo bar
ฉันfind
จะคืนชื่อที่ถูกต้องได้อย่างไร
เห็นได้ชัดว่าฉันต้องการ:
foo\ bar
หรือ:
"foo bar"
แก้ไข : ฉันไม่ต้องการผ่านxargs
ฉันต้องการดึงสตริงที่จัดรูปแบบอย่างถูกต้องออกมาfind
เพื่อที่ฉันจะได้ไพพ์สตริงของชื่อไฟล์โดยตรงไปยังโปรแกรมอื่น
find
รูปแบบชื่อไฟล์ที่ใช้ได้ พวกเขาเขียนหนึ่งชื่อต่อบรรทัด (แน่นอนว่าสิ่งนี้คลุมเครือถ้าชื่อไฟล์มีอักขระขึ้นบรรทัดใหม่) ดังนั้นปัญหาก็คือ "สำลัก" ที่ได้รับเมื่อสิ้นสุดพื้นที่ซึ่งหมายความว่าคุณต้องบอกเราว่าจุดสิ้นสุดนั้นคืออะไรถ้าคุณต้องการคำตอบที่มีความหมาย .
find
จะเสนอทางเลือกให้กับชื่อไฟล์ที่ส่งออกในรูปแบบที่เหมาะสมกับเชลล์ โดยทั่วไปแล้วส่วนขยาย-print0
GNU นั้นfind
ใช้ได้ดีสำหรับสถานการณ์อื่น ๆ (เช่นกัน) และคุณควรเรียนรู้ที่จะใช้มันในทุกกรณี
ls $(command...)
stdin
มันทำให้เอาท์พุทของ$(command...)
โดยตรงในบรรทัดคำสั่ง ในกรณีนั้นมันคือเชลล์ที่อ่านจาก c และมันจะใช้ค่าปัจจุบันของ$IFS
เพื่อตัดสินใจว่าจะใช้คำพูดกับเอาต์พุตอย่างไร xargs
โดยทั่วไปคุณดีกว่าการใช้ คุณจะไม่สังเกตเห็นถึงประสิทธิภาพ
find -printf '"%p"\n'
จะเพิ่มเครื่องหมายคำพูดคู่รอบชื่อที่พบ แต่จะไม่อ้างอิงเครื่องหมายคำพูดคู่ใด ๆ ในชื่อไฟล์อย่างถูกต้อง ถ้าชื่อไฟล์ของคุณไม่ได้มีคำพูดคู่ใด ๆ ที่ฝังตัวคุณสามารถละเว้นปัญหา: sed 's/"/&&/g;s/^""/"/;s/""$/"/'
หรือท่อผ่าน หากชื่อไฟล์ของคุณถูกจัดการโดยเชลล์คุณควรใช้เครื่องหมายคำพูดเดี่ยวแทนเครื่องหมายคำพูดคู่ (แต่sweet$HOME
จะกลายเป็นอย่างอื่นsheet/home/you
) และนี่ยังคงไม่แข็งแกร่งมากเมื่อเทียบกับชื่อไฟล์ที่มีบรรทัดใหม่ในนั้น คุณต้องการจัดการสิ่งเหล่านั้นอย่างไร?
-exec
ธงด้วยfind
หรือไม่ คุณอาจจะสามารถบรรเทาข้อผิดพลาดนี้และทำให้คำสั่งของคุณมีประสิทธิภาพมากขึ้นโดยทำ-exec
แทนการไพพ์ไปยังคำสั่งอื่น แค่ $ .02 ของฉัน