ฉันจะส่งคืนเฉพาะชื่อไฟล์จากคำสั่ง find ได้อย่างไร


14

ฉันกำลังมองหารายชื่อไฟล์เพียงชื่อ (ไม่มีส่วนที่เหลือของเส้นทาง) เมื่อรันคำสั่ง find จากเทอร์มินัล ฉันจะทำสิ่งนี้ให้สำเร็จบน mac ได้อย่างไร?

คำตอบ:


18

ด้วยชื่อฐาน:

find . -type f -exec basename {} \;


วงเล็บปีกกาคืออะไร
nullpotent

basename ถูกเรียกใช้หนึ่งครั้งสำหรับทุกไฟล์ที่พบซึ่งแสดงโดย {}
ЯрославРахматуллин

ค่าเฉลี่ยของ \ and; ?
neouyghur

@neouyghur ;ยุติการ-execกระทำ \ เป็นสิ่งจำเป็นเพราะ;ยังมีความหมายพิเศษกับเปลือก
8bittree

6

Evilsoup กล่าวว่าสิ่งที่โพสต์ไม่ทำงานสำหรับชื่อไฟล์ที่เว้นระยะ ดังนั้นแทนที่จะใช้:

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done

นี้จะแบ่งไฟล์ที่มีช่องว่างในชื่อของพวกเขา (ดูการแยกคำ lsใน wiki ของ greg)
evilsoup

+1 สำหรับความเร็ว ฉันไม่รู้ว่าฉันทำอะไรผิดหรือเปล่า แต่อันนี้ใช้เวลา 1 วินาทีกับ $ HOME ของฉันในขณะที่คนอื่น ๆ ใช้เวลาประมาณ 10 วินาที แน่นอนว่าฉันต้องใช้เวลามากกว่า 10 วินาทีในการค้นหาและพิมพ์มัน
เปาโลอัลไมด้า

2

ด้วย GNU find คุณสามารถทำได้:

 find ~/tmp/ -printf "%f\n"

นี่อาจเป็นสิ่งที่ควรลองใน OS X เช่นกัน


2
-printfไม่ได้รับการสนับสนุนบน findBSD
Daniel Beck

1
นอกจากนี้-printfหมีเล็ก ๆ น้อย ๆ ความสัมพันธ์กับ C หรือยูทิลิตี้printf POSIX เปลือก printfการใช้ชื่อฟังก์ชั่นทางประวัติศาสตร์สำหรับสิ่งที่แตกต่างกันถือว่าแย่มาก พวก BSD ที่อนุรักษ์นิยมน่าจะเห็นแบบเดียวกันดังนั้นเราอาจจะไม่เห็นโคลน-printfในการค้นพบ BSD ภายใต้ชื่อนั้น
Kaz

ฉันไม่เห็นด้วยที่จะถือว่าใช้ชื่อฟังก์ชั่นที่คุ้นเคยเพื่อทำงานที่คล้ายกันในบริบทที่แตกต่างกัน ทำไม BSD อาจไม่เคยสนับสนุนมันเป็นเรื่องอื่น
ЯрославРахматуллин

2

มีวิธีที่ดีกว่าในการตัดทุกอย่างยกเว้นส่วนสุดท้ายของเส้นทางไฟล์ ด้วย awk จะดีกว่าเพราะ awk ไม่ได้ดำเนินการหนึ่งครั้งสำหรับทุกไฟล์ ในบางกรณีเรื่องนี้

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

เราค้นหาเฉพาะไฟล์ใน ~ / tmp และเราจะได้รายการที่ทุกรายการถูกคั่นด้วยเครื่องหมายทับ ดังนั้นเราใช้เครื่องหมายสแลชเป็นตัวคั่นฟิลด์ (-F /) และพิมพ์พารามิเตอร์ฟิลด์ ($ 1 .. $ 9) ที่สอดคล้องกับฟิลด์สุดท้าย ($ NF)


นี่คือวิธีทดสอบที่เร็วที่สุด
เปาโลอัลไมด้า

ฉันใช้ Cygwin เมื่อเร็ว ๆ นี้และการสร้างกระบวนการใน windows มีราคาแพงมาก ...
ЯрославРахматуллин

2

แก้ไข :

การใช้sed:

$ find . -type f | sed 's/.*\///'

การใช้คำสั่งxargsดังที่กล่าวไว้ในการตอบสนองของ @nerdwaller

$ find . -type f -print0 | xargs --null -n1 basename

1
ขอบคุณสำหรับการชี้ให้เห็นว่า +1, ฉันไม่ได้ใช้ xargs มาก ... ควรจะแน่นอนเพราะคุณทำตัวละครออกคำสั่งของฉัน
nerdwaller

อันนี้แตกเมื่อไฟล์มีช่องว่าง ทำงานอย่างนี้อย่างน้อยในการทดสอบอย่างรวดเร็ว:find . -type f -print0| xargs --null -n1 basename
เปาโลอัลไมด้า

ไม่มีตัวเลือก--nullหรือ-n1ตัวเลือกใด ๆ ใน OSX
Valeriy Van

1

เกี่ยวกับสิ่งนี้:

find … | egrep -o -e '[^/]+$'

ข้อได้เปรียบ: มีกระบวนการเพิ่มเติมเพียงกระบวนการเดียวเท่านั้นที่วางไข่ไม่ใช่กระบวนการเดียวสำหรับแต่ละผลลัพธ์


0

คุณสามารถโทรshจากภายใน-execตัวเลือกการค้นหาและหลีกเลี่ยงการใช้ท่อที่ไม่จำเป็น นอกจากนี้ยังมีข้อดีที่คุณไม่ต้องกังวลเกี่ยวกับชื่อไฟล์ตลก (ช่องว่างการขึ้นบรรทัดใหม่ ฯลฯ ):

find . -type f -exec sh -c 'echo "${0##*/}"' {} \;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.