ไม่ปลอดภัยที่จะแยกวิเคราะห์ls
หรือไปป์find
[ 1 , 2 ]
มันไม่ปลอดภัยที่จะแยก (และท่อ) การส่งออกของls
หรือfind
ส่วนใหญ่เป็นเพราะมันเป็นไปได้ที่จะหาในชื่อไฟล์ตัวอักษรปกติไม่ใช่เป็นnewlineที่แท็บ ... ที่นี่รอบเปลือกบริสุทธิ์จะทำงาน[ cuonglm ]
แม้แต่find
คำสั่งที่ไม่ได้ไพพ์ด้วยตัวเลือก-exec
ก็สามารถใช้งานได้:
find ./*.png -exec basename {} .png \;
อัปเดต / หมายเหตุ : คุณสามารถใช้find .
เพื่อค้นหาแม้กระทั่งไฟล์ที่ซ่อนอยู่หรือfind ./*.png
เพื่อให้ได้เฉพาะไฟล์ที่ไม่ซ่อน ด้วยfind *.png -exec ...
คุณสามารถมีปัญหาในกรณีที่มันเป็นไฟล์ชื่อ.png
เพราะหาจะได้รับมันเป็นตัวเลือก คุณสามารถเพิ่ม-maxdepth 0
เพื่อหลีกเลี่ยงการสืบทอดในไดเรกทอรีที่ชื่อเป็นDir_01.png
หรือfind ./*.png -prune -exec ...
เมื่อไม่อนุญาต maxdepth (ขอบคุณStéphane) หากคุณต้องการหลีกเลี่ยงการแสดงรายการไดเรกทอรีเหล่านั้นคุณควรเพิ่มตัวเลือก-type f
(ซึ่งจะเป็นการยกเว้นไฟล์ที่ไม่ใช่ไฟล์ประเภทอื่นด้วย) ลองดูman
ภาพพาโนรามาที่สมบูรณ์ยิ่งขึ้นเกี่ยวกับตัวเลือกทั้งหมดที่มีอยู่และอย่าลืมตรวจสอบว่าเป็นไปตาม POSIX เพื่อความสะดวกในการพกพามากขึ้น
บางคำเพิ่มเติม
มันสามารถเกิดขึ้นได้เช่นการคัดลอกชื่อเรื่องจากเอกสารและวางลงในชื่อไฟล์หนึ่งบรรทัดขึ้นไปจะเสร็จสิ้นในชื่อไฟล์เอง เราอาจโชคร้ายที่ชื่อสามารถมีแม้กระทั่งกุญแจที่เราต้องใช้ก่อนหน้าบรรทัดใหม่:
The new art of working on .png
files and other formats.
หากคุณต้องการทดสอบคุณสามารถสร้างชื่อไฟล์แบบนี้ได้ด้วยคำสั่ง
touch "A file with two lines"$'\n'"and This is the second.png"
touch "The new art of working on .png"$'\n'"files and other formats.png"
วิ/bin/ls *png
ออกจะง่าย ๆ?
แทนที่จะเป็นอักขระที่ไม่สามารถพิมพ์ได้
A file with two lines?and This is the second.png
The new art of working on .png?files and other formats.png
ในกรณีทั้งหมดที่คุณจะท่อส่งออกของls
หรือfind
คำสั่งดังต่อไปนี้จะมีคำใบ้ที่จะเข้าใจหากสายในปัจจุบันมาจากใหม่ไม่มีชื่อไฟล์หรือถ้ามันเป็นไปตามการขึ้นบรรทัดใหม่ตัวละครในแบบอย่างชื่อไฟล์ น่ารังเกียจชื่อจริง แต่ยังคงตามกฎหมายอย่างใดอย่างหนึ่ง
รอบเปลือกหอยที่มีเปลือกพารามิเตอร์การขยายตัว${parameter%word}
ทั้งในตัวแปรที่มีprintf
หรือecho
จะทำงาน[ cuonglm ], [ Anthon1 ]
for f in *.png; do printf "%s\n" "${f%.png}" ; done
จากหน้าแรกของการขยายพารามิเตอร์เชลล์[ 3 ]
$ {พารามิเตอร์% คำ}
$ {พารามิเตอร์ %% คำ}
... ผลลัพธ์ของการขยายคือค่าพารามิเตอร์ที่มีรูปแบบการจับคู่สั้นที่สุด (ตัวพิมพ์ '%') หรือรูปแบบการจับคู่ที่ยาวที่สุด (ตัวพิมพ์ '%%')
.
อยู่ในนั้น แม้ว่าการประชุมกล่าวว่าการตั้งชื่อไฟล์ของคุณด้วย.png
ในตอนท้ายมีเหตุผลว่าทำไมฉันไม่สามารถมี PNG ไฟล์ที่ชื่อว่าไม่มีfoo.zip
หรือหรือเพียงแค่my.picture.20160518
mypic