เอาต์พุต“ find” ที่สัมพันธ์กับไดเร็กทอรี


34

ฉันต้องการใช้findเพื่อแสดงรายการไฟล์และไดเรกทอรีทั้งหมดซ้ำในรูทที่กำหนดสำหรับการcpioดำเนินการ อย่างไรก็ตามฉันไม่ต้องการให้รูทไดเร็กทอรีนั้นปรากฏในพา ธ ตัวอย่างเช่นปัจจุบันฉันได้รับ:

$ find diskimg
diskimg
diskimg/file1
diskimg/dir1
diskimg/dir1/file2

แต่ฉันต้องการได้รับ

file1
dir1
dir1/file2

(โปรดทราบว่ารูทนั้นไม่ได้อยู่ในผลลัพธ์ที่ฉันต้องการ แต่ก็สามารถกำจัดได้อย่างง่ายดายtail)

ฉันใช้ OS X และฉันไม่ต้องการติดตั้งเครื่องมือพิเศษใด ๆ (เช่น GNU พบ) ถ้าเป็นไปได้เนื่องจากฉันต้องการแบ่งปันสคริปต์ที่ฉันเขียนกับผู้ใช้ OS X คนอื่น

ฉันรู้ว่าสามารถทำได้ด้วยcutการตัดรายชื่อรูทออก แต่นั่นดูเหมือนจะเป็นวิธีแก้ปัญหาที่ไม่ดี มีวิธีแก้ปัญหาที่ดีกว่านี้ไหม?


find diskimg/* | cut -d '/' -f2-
nik.shornikov

คำตอบ:


18

หากสิ่งที่คุณพยายามทำนั้นไม่ซับซ้อนเกินไปคุณสามารถทำสิ่งนี้ให้สำเร็จได้ด้วย:

find diskimg | sed -n 's|^diskimg/||p'

หรือcut:

find diskimg | cut -sd / -f 2-

คุณสามารถเลือก (เกือบ) ตัวคั่นใด ๆ สำหรับคำสั่งดังนั้น: find diskimg | grep -v '^diskimg$' | sed -e 's|^diskimg/||'(หมายเหตุฉันเพิ่มด้วย '-e' และ^แนวปฏิบัติที่ดี (ไม่จำเป็นที่นี่เนื่องจากคุณแน่ใจว่าทุกบรรทัดจะมีสิ่งนี้ ... แต่ก็ยังเป็นแนวปฏิบัติที่ดี และบันทึกซีพียูบางตัว;))
Olivier Dulac

อีกวิธีหนึ่งโดยไม่ต้อง grep: find diskimg | sed -e 's|^diskimg/*||' ('/ *' จะตรงกับจำนวนใด ๆ ของ '/', แม้แต่ 0)
Olivier Dulac

นี้cutคำสั่งสะอาดกว่าหนึ่งที่ผมใช้; ฉันชอบมัน. ( sedวิธีแก้ปัญหาก็ดีเหมือนกัน แต่การทำซ้ำ ๆ ของdiskimg/โชคร้ายเล็กน้อย)
nneonneo

30

cd ลงในไดเรกทอรีก่อน:

cd diskimg && find . 

เมื่อเสร็จแล้วคุณจะกลับมาที่ไดเรกทอรีราก

ไฟล์ของคุณจะถูกเติมด้วย. / ในกรณีนี้ วิธีเดียวที่ฉันเห็นรอบ ๆ ที่จะใช้cut:

{ cd diskimg && find .; } | tail -n +2 | cut -c 3-

ใช้เชลล์ย่อยเพื่อหลีกเลี่ยงการเปลี่ยนไดเรกทอรีปัจจุบันของเชลล์ (ไม่จำเป็นถ้าคุณไพพ์เอาท์พุทเนื่องจากด้านซ้ายมือของไพพ์ทำงานในเชลล์ย่อยแล้ว)

(cd diskimg && find .)

5
ที่จะกลับมาใน dir เดิมเมื่อเสร็จสิ้น: (cd diskimg && find . ; )เพิ่มวงเล็บ: วิธีcd diskimg && find .นี้จะทำใน subshell: เมื่อ subshell นั้นออกจากคุณกลับไปที่เชลล์ของคุณเองไม่ว่าคุณจะอยู่ในไดเรกทอรีใด
Olivier Dulac

1
find *เป็นอีกวิธีหนึ่งรอบคำนำหน้าไร้ประโยชน์
nik.shornikov

23

อีกวิธีที่ซับซ้อนกว่า แต่ใช้การค้นหาจากคำตอบอื่น

find diskimg -mindepth 1 -printf '%P\n'

ไม่ได้ทุกรุ่นของการสนับสนุนfind printf
จอร์แดน

1
แน่นอน; OSX ของฉันไม่ดูเหมือน ส่วนหนึ่งทำไมฉันจึงเสนอวิธีแก้ไขปัญหาอื่น
เตฟาน

2
@Stephan - ครั้งต่อไปคุณสามารถรวมคำตอบประเภทนี้เป็นคำตอบเดียว ไม่จำเป็นต้องตอบหลายคำตอบสำหรับความแปรปรวนเช่นนี้
slm

2
เฉพาะ GNU ที่findรองรับ-printfในขณะที่ BSD จำนวนมากfindได้คัดลอกคุณสมบัติบางอย่างของ GNU findแต่ยังไม่มีการคัดลอก-printf(AFAIK)
Stéphane Chazelas

%Pสำหรับเส้นทางญาติคือสิ่งที่ฉันต้องการ
Fl0v0

4

ใช้realpathยูทิลิตี้:

find diskimg -exec realpath --relative-to diskimg {} \;

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