ฉันกำลังมองหารายชื่อไฟล์เพียงชื่อ (ไม่มีส่วนที่เหลือของเส้นทาง) เมื่อรันคำสั่ง find จากเทอร์มินัล ฉันจะทำสิ่งนี้ให้สำเร็จบน mac ได้อย่างไร?
ฉันกำลังมองหารายชื่อไฟล์เพียงชื่อ (ไม่มีส่วนที่เหลือของเส้นทาง) เมื่อรันคำสั่ง find จากเทอร์มินัล ฉันจะทำสิ่งนี้ให้สำเร็จบน mac ได้อย่างไร?
คำตอบ:
ด้วยชื่อฐาน:
find . -type f -exec basename {} \;
;
ยุติการ-exec
กระทำ \
เป็นสิ่งจำเป็นเพราะ;
ยังมีความหมายพิเศษกับเปลือก
Evilsoup กล่าวว่าสิ่งที่โพสต์ไม่ทำงานสำหรับชื่อไฟล์ที่เว้นระยะ ดังนั้นแทนที่จะใช้:
find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done
ด้วย GNU find คุณสามารถทำได้:
find ~/tmp/ -printf "%f\n"
นี่อาจเป็นสิ่งที่ควรลองใน OS X เช่นกัน
-printf
ไม่ได้รับการสนับสนุนบน find
BSD
-printf
หมีเล็ก ๆ น้อย ๆ ความสัมพันธ์กับ C หรือยูทิลิตี้printf
POSIX เปลือก printf
การใช้ชื่อฟังก์ชั่นทางประวัติศาสตร์สำหรับสิ่งที่แตกต่างกันถือว่าแย่มาก พวก BSD ที่อนุรักษ์นิยมน่าจะเห็นแบบเดียวกันดังนั้นเราอาจจะไม่เห็นโคลน-printf
ในการค้นพบ BSD ภายใต้ชื่อนั้น
มีวิธีที่ดีกว่าในการตัดทุกอย่างยกเว้นส่วนสุดท้ายของเส้นทางไฟล์ ด้วย awk จะดีกว่าเพราะ awk ไม่ได้ดำเนินการหนึ่งครั้งสำหรับทุกไฟล์ ในบางกรณีเรื่องนี้
find ~/tmp/ -type f | awk -F/ '{ print $NF }'
เราค้นหาเฉพาะไฟล์ใน ~ / tmp และเราจะได้รายการที่ทุกรายการถูกคั่นด้วยเครื่องหมายทับ ดังนั้นเราใช้เครื่องหมายสแลชเป็นตัวคั่นฟิลด์ (-F /) และพิมพ์พารามิเตอร์ฟิลด์ ($ 1 .. $ 9) ที่สอดคล้องกับฟิลด์สุดท้าย ($ NF)
แก้ไข :
การใช้sed
:
$ find . -type f | sed 's/.*\///'
การใช้คำสั่งxargsดังที่กล่าวไว้ในการตอบสนองของ @nerdwaller
$ find . -type f -print0 | xargs --null -n1 basename
find . -type f -print0| xargs --null -n1 basename
--null
หรือ-n1
ตัวเลือกใด ๆ ใน OSX
เกี่ยวกับสิ่งนี้:
find … | egrep -o -e '[^/]+$'
ข้อได้เปรียบ: มีกระบวนการเพิ่มเติมเพียงกระบวนการเดียวเท่านั้นที่วางไข่ไม่ใช่กระบวนการเดียวสำหรับแต่ละผลลัพธ์
คุณสามารถโทรsh
จากภายใน-exec
ตัวเลือกการค้นหาและหลีกเลี่ยงการใช้ท่อที่ไม่จำเป็น นอกจากนี้ยังมีข้อดีที่คุณไม่ต้องกังวลเกี่ยวกับชื่อไฟล์ตลก (ช่องว่างการขึ้นบรรทัดใหม่ ฯลฯ ):
find . -type f -exec sh -c 'echo "${0##*/}"' {} \;