ฉันต้องการไพพ์ชื่อไฟล์ไปยังโปรแกรมอื่น แต่พวกมันทั้งหมดทำให้หายใจไม่ออกเมื่อชื่อมีช่องว่าง
สมมติว่าฉันมีไฟล์ที่เรียกว่า
foo bar
ฉันfindจะคืนชื่อที่ถูกต้องได้อย่างไร
เห็นได้ชัดว่าฉันต้องการ:
foo\ bar
หรือ:
"foo bar"
แก้ไข : ฉันไม่ต้องการผ่านxargsฉันต้องการดึงสตริงที่จัดรูปแบบอย่างถูกต้องออกมาfindเพื่อที่ฉันจะได้ไพพ์สตริงของชื่อไฟล์โดยตรงไปยังโปรแกรมอื่น
findรูปแบบชื่อไฟล์ที่ใช้ได้ พวกเขาเขียนหนึ่งชื่อต่อบรรทัด (แน่นอนว่าสิ่งนี้คลุมเครือถ้าชื่อไฟล์มีอักขระขึ้นบรรทัดใหม่) ดังนั้นปัญหาก็คือ "สำลัก" ที่ได้รับเมื่อสิ้นสุดพื้นที่ซึ่งหมายความว่าคุณต้องบอกเราว่าจุดสิ้นสุดนั้นคืออะไรถ้าคุณต้องการคำตอบที่มีความหมาย .
findจะเสนอทางเลือกให้กับชื่อไฟล์ที่ส่งออกในรูปแบบที่เหมาะสมกับเชลล์ โดยทั่วไปแล้วส่วนขยาย-print0GNU นั้น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 ของฉัน