วิธีรับชื่อจากคำสั่ง find ที่ไม่มีพา ธ


14

ฉันพยายามรับเฉพาะชื่อจากผลการค้นหาโดยใช้ find แต่จะรวมถึงไดเรกทอรีด้วยเสมอ ฉันจะพิมพ์เฉพาะชื่อ (หรือกำหนดให้กับตัวแปร) โดยใช้ find ได้อย่างไร

find trunk/messages/ -name "*.po" -printf '%f\n'

คำสั่งที่คล้ายกันเพื่อกำหนดให้ตัวแปรเช่น "ทรัพยากร" เพื่อใช้ในภายหลัง

แก้ไข: และถ้าเป็นไปได้เฉพาะชื่อที่ไม่รวมส่วนขยาย

คำตอบ:


20

ใช้ find trunk/messages/ -name "*.po" -exec basename {} .po \;

ตัวอย่างและคำอธิบาย:

สร้างไฟล์ทดสอบบางไฟล์:

$ touch test1.po  
$ touch test2.po  
$ find . -name "*.po" -print
./test1.po  
./test2.po

ตกลงพบไฟล์รวมถึงพา ธ

สำหรับผลลัพธ์แต่ละรายการจะดำเนินการbasenameและดึงส่วน. po ของชื่อออก

$ find . -name "*.po" -exec basename \{} .po \;  
test1  
test2

ขอบคุณมาก :) ฉันสามารถดึงเฉพาะส่วนขยาย PO จาก dirs ได้หรือไม่ ฉันหมายถึง: dir1 / po1.po และ dir2 / po2.po พวกเขาจะได้เหมือน dir1 / po1 และ dir2 / po2 หรือไม่
wakeup

@ user1754665find . -name '*.po' -exec bash -c 'echo ${0%.po}' {} \;
slhck

@slhck ขอบคุณ สุดท้ายฉันต้องได้รับชื่อไฟล์โดยไม่มีนามสกุลและโฟลเดอร์สุดท้ายที่อยู่ใน: เช่น: dir1 / subdir1 / subsubdir1 / po1.po และ dir2 / subdir2 / subsubdir2 / po2.po ควรตั้งเป็นตัวแปรเช่น: subsubdir1 / po1 subsubdir2 / po2 ตามลำดับ
wakeup

@ user1754665 อืมอาจจะfind . -name '*.po' -type f -exec sh -c 'echo $(basename $(dirname $0))/$(basename $0)' {} \;
slhck

@Hennes จุดประสงค์ของแบ็กสแลชก่อนที่จะเปิดวงเล็บปีกกาในครั้งสุดท้ายfindคืออะไร?
Utku

3

คุณสามารถใช้-execdirพารามิเตอร์ที่จะพิมพ์ไฟล์โดยไม่มีเส้นทางเช่น:

find . -name "*.po" -execdir echo {} ';'

ไฟล์ที่ไม่มีนามสกุล:

find . -name "*.txt" -execdir basename {} .po ';'

หมายเหตุ: เนื่องจากมันไม่ POSIX, BSD findจะพิมพ์ชื่อไฟล์ที่สะอาด แต่ใช้ GNU จะพิมพ์พิเศษfind./

ดู: ทำไมคำสั่ง GNU find -execdir ทำงานต่างจาก BSD find


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.