คุณส่งออกชื่อไฟล์ในคำสั่ง find ขณะใช้ -exec ได้อย่างไร


33

ฉันใช้บรรทัดต่อไปนี้เพื่อค้นหาไดเรกทอรีย่อยทั้งหมดของ PWD และเรียกใช้svnadmin verifyในแต่ละไดเรกทอรี (ฉันรู้อยู่แล้วว่าพวกเขาเป็นที่เก็บข้อมูลการโค่นล้ม)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

สิ่งนี้ทำงานได้ดีนอกเหนือจากข้อเท็จจริงที่ว่าผลลัพธ์จะเป็นดังนี้:

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

ฉันต้องการfindพิมพ์ชื่อไฟล์ก่อนดำเนินการsvnadmin verifyคำสั่งเพื่อให้การบันทึกง่ายขึ้น

ฉันพยายามจะบีบนิดหน่อยที่lsนั่น แต่เอาไปทำยังไงดีฉันจะทำยังไงดีล่ะ?

คำตอบ:


36

เพียงเพิ่ม-printfตัวเลือกก่อน

find -printf '%p' -exec command \;

4
น่ารักผมเปลี่ยน'%p'ไป'%p\n'เพื่อให้นำหน้าชื่อตรวจสอบการส่งออกในบรรทัดของตัวเอง
Arronical

17
@Arronical หากเป็นรูปแบบที่คุณต้องการคุณสามารถแทนที่ (จัดรูปแบบ) -printf '%p\n'ด้วยตัวที่ง่ายขึ้น-print
steeldriver

4
find -name <a_name> -print -exec command {} \;
toliveira

14

หากคุณไม่ต้องการที่จะ recurse findมีจุดในการใช้ไม่มี มันง่ายกว่ามากในการทำเชลล์โดยตรง:

for d in */; do echo "$d"; svnadmin verify "$d"; done

for d in */จะพบไดเรกทอรีทั้งหมด (คน*/มั่นใจไดเรกทอรีเท่านั้นและไม่มีไฟล์จะพบ); echo "$d"จะพิมพ์ชื่อไดเรกทอรีของ; svnadmin verify "$d"จะตรวจสอบไดเรกทอรี

สิ่งนี้สามารถเรียกใช้โดยตรงจากบรรทัดคำสั่งหรือจากภายในสคริปต์โดยไม่มีการเปลี่ยนแปลงในรูปแบบ


1
นี่เป็นวิธีที่ดีกว่าในการบรรลุเป้าหมายของฉัน แต่ฉันต้องให้คำตอบกับ Fiximan เพียงเพราะชื่อเรื่องและการอ้างอิงคำถามของฉันfindมากมาย ขอบคุณสำหรับการพัฒนาความรู้ของฉัน!
Arronical

สิ่งนี้ต้องใช้ glob Globbing มีประโยชน์และทรงพลังอย่างแน่นอน แต่ในประสบการณ์ส่วนตัวของฉันไวยากรณ์ยากต่อการติดตั้งและมักจะจบลงด้วยการต้องการสิ่งอื่น ๆ เช่นdotglobและglobstarในการทุบตีซึ่งสร้างสคริปต์ที่ยาวและซับซ้อนกว่า ฉันมักจะบันทึก globs สำหรับงานที่ซับซ้อนขนาดใหญ่ในขณะที่findไวยากรณ์ของมันง่ายกว่าที่จะรวมเข้าด้วยกันอย่างง่ายดายโดยการรวมตัวกรองและคำสั่งเข้าด้วยกันเป็นชุดเดียว
user5359531

@ user5359531 ไม่ว่าจะเป็น globstar หรือ dotglob (ยกเว้นว่าคุณรู้ว่าคุณมีไฟล์ที่ซ่อนอยู่และต้องการมันจริงๆ) จำเป็นต้องใช้ที่นี่ เห็นได้ชัดว่านี่เป็นเรื่องของความเห็น แต่คุณเป็นคนแรกที่ฉันเคยเจอที่พิจารณารูปแบบที่ค่อนข้างfindง่ายกว่า ฉันชอบที่จะมองข้ามfindเพราะฉันไม่เพียง แต่พบว่ามันง่ายกว่า แต่ยังปลอดภัยกว่าเมื่อต้องจัดการกับชื่อไฟล์ที่กำหนดเองซึ่งส่งผ่านไปยังโปรแกรมอื่น
terdon

6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

ฉันได้เพิ่ม-type dถ้ามันเป็นไดเรกทอรีเท่านั้น


ฉันจะอ้างอิง{}อย่างน้อยในsvnadmin verify {}
kos

ขอบคุณสำหรับการตอบสนองที่รวดเร็ว ดังนั้นในคำสั่งนี้จะ-execวางไข่เปลือกลูกซึ่งคำสั่ง 2 จะทำงานโดยใช้;เป็นจุดสิ้นสุดบรรทัด?
58

5

ลองสิ่งนี้:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

หากคุณต้องการไดเรกทอรี (ขอบคุณ @kos note):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

ดี แต่มันจะประมวลผลไฟล์ด้วย: for f in */จะประมวลผลเฉพาะไดเรกทอรี
kos

สิ่งนี้จะทำงานในสคริปต์หรือไม่ หรือฉันจะออกมันในบรรทัดคำสั่ง?
58

1
@Arronical จะทำงานเป็นบรรทัดคำสั่งด้วย
Maythux

2
  • ใช้. -maxdepth 1แทนคุณ./*ต้องการเพียงระดับแรกในโครงสร้างโฟลเดอร์
  • ใช้-type dคุณต้องการเพียงโฟลเดอร์
  • ใช้! -name "."คุณไม่ต้องการ.
  • ใช้-execเพื่อเริ่มเปลือก
  • ใช้sh -cเพื่อเริ่มคำสั่งภายในเชลล์

คำสั่งของคุณ

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

หรือสั้นกว่า

  • ใช้-pruneถ้าไฟล์เป็นไดเรกทอรีห้ามลงมา

คำสั่งของคุณ

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 

-pruneดูน่าสนใจ ฉันเคย./* -maxdepth 0หลีกเลี่ยงการกลับมา.จากคำสั่ง find ไม่ได้ทำให้เกิดข้อผิดพลาดร้ายแรง แต่ฉันไม่ต้องการให้มันเอาท์พุท
Arronical

1

findมีธงตัวเลือกสำหรับการพิมพ์ซึ่งถูกกล่าวถึงแล้วในคำตอบอื่น ๆ หากเรามองปัญหาจากมุมมองของการดำเนินการหลายคำสั่งสำหรับไฟล์ที่ประมวลผลในปัจจุบันเดียวกันfindอนุญาตให้ใช้หลาย-execคำสั่ง หมายความว่าเราสามารถเลือกใช้:

find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; 

อีกครั้งทราบว่าวิธีการนี้จะใช้บังคับกับการไม่ได้เป็นเพียงการพิมพ์ด้วยecho, printfหรือสาธารณูปโภคอื่น ๆ แต่ยังคำสั่งอื่น ๆ


0

มันอาจมีประโยชน์ในการไพพ์findเอาต์พุตไปยังreadลูป

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

ช่วยให้คุณสามารถดำเนินการตามลำดับคำสั่งผสมที่ซับซ้อนมากขึ้นด้วยชื่อไฟล์ที่ส่งคืนโดยfindเช่นในlsตัวอย่างแฟนซีนี้:

find . | while read f; do echo ${f} | figlet -k; done

-1

สิ่งนี้จะพิมพ์ชื่อและเนื้อหาของไฟล์แบบเรียกซ้ำเท่านั้น

find . -type f -printf '\n\n%p:\n' -exec cat {} \;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.