ฉันจะนำไพพ์อินพุตไปยังคำสั่ง ls ได้อย่างไร?


20

เมื่อฉันพิมพ์บางสิ่งที่ชอบ:

find . -name *foo* | ls -lah

มันจะส่งกลับผลลัพธ์เช่นเดียวกับlsคำสั่งธรรมดาราวกับว่ามันไม่มีอินพุต

อย่างไรก็ตาม:

ls -lah $( find . -name *foo* )

ทำงานได้ดี แต่เฉพาะเมื่อfindคำสั่งมีผลลัพธ์

เป็นไปได้ที่จะท่อไปls?


คุณต้องระบุว่าคุณต้องการไฟล์ในผลการค้นหาแต่ละรายการหรือไม่หรือคุณต้องการค้นหาผลลัพธ์โดยตรง ถ้าเป็นหลังคำตอบของ u / Dennis คือคำตอบที่ถูกต้อง
rmutalik

คำตอบ:


27

คุณสามารถใช้-execกับfindคำสั่ง

find . -name '*foo*' -exec ls -lah {} \;

ขอบคุณสำหรับวิธีการแก้ปัญหาของคุณ ไม่มีท่อ แต่มันเป็นวิธีที่สง่างาม หากไม่พบผลลัพธ์ใด ๆ ด้วย 'ค้นหา' จะไม่แสดงผลใด ๆ (ที่จริงแล้วเป็นสิ่งที่ดี)
Lasall

7
วิธีที่ดีกว่าเล็กน้อย:find . -name '*foo*' -exec ls -lah {} +
jlliagre

20
find . -name *foo* | xargs -r ls -lah

ว่าควรจะทำงาน


1
ขอบคุณสำหรับการแก้ปัญหานั้น แต่ฉันจะจัดการกับช่องว่างได้อย่างไร
Lasall

2
@Lasall วิธีที่ต้องการคือการใช้ find's -exec +(หรือ-exec \;) xargsปลอดภัยเท่านั้นที่จะใช้กับ-0ตัวเลือกซึ่งหมายความว่าคุณต้องบอกสิ่งที่คุณสั่งท่อxargsเพื่อคั่นรายการด้วย NULL-bytes (\ 0) ด้วยคุณสามารถทำเช่นนั้นด้วยfind -print0xargs's -0 และ find's -print0 ไม่ได้เป็นมาตรฐาน แต่ -exec คือดังนั้นหากความสะดวกในการพกพาเป็นปัญหาให้ใช้ find with -exec
geirha


3

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

find . -name *foo* -print0 | xargs -0 ls -lah

"-print0" หมายถึงชื่อไฟล์เช่นfile foo 1จะได้รับผลลัพธ์จากการfindตามด้วย null อาร์กิวเมนต์ "-0" ถึง xargs บอกให้คาดหวังอินพุตประเภทนี้ดังนั้นชื่อไฟล์ที่มีช่องว่างจะถูกไพพ์ไปยังlsคำสั่งอย่างถูกต้อง

การxargsก่อสร้างในบางวิธีดีกว่าfind etc -exec ls {} \;เพราะชื่อไฟล์ทั้งหมดถูกส่งไปlsในครั้งเดียวดังนั้นหากคุณต้องการเรียงลำดับพวกเขาทั้งหมดด้วยการประทับเวลา (โดยใช้ls) สิ่งที่คล้ายกับงานนี้:

find . -iname *pdf -print0 | xargs -0 ls -ltr

บนระบบ NetBSD "-printx" ก็เป็นตัวเลือกเช่นกัน (นี่เป็นอาร์กิวเมนต์ที่มีประโยชน์สำหรับฉัน แต่ไม่ว่าอะไรก็ตามเรามี xargs -0 และมันก็โอเค):

find . -name *foo* -printx | xargs ls -lah (ไม่ใช่สำหรับ Ubuntu)


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