รับรายชื่อไดเรกทอรีพร้อมค้นหา


35

ฉันรู้ว่าฉันสามารถทำได้เพื่อรับรายชื่อไดเรกทอรี:

find . -type d -maxdepth 1 

ผลลัพธ์มีลักษณะดังนี้:

.
./foo
./bar

./ฉันชอบรายชื่อโดยไม่ต้อง มีวิธีหาเอาท์พุทเพียงชื่อดิบหรือไม่?

ฉันพยายามส่งรายการไปที่ stat เพื่อจัดรูปแบบ แต่ให้ผลลัพธ์แบบเดียวกัน:

find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'

ดังนั้นคุณต้องการfoo bar ...ทั้งหมดในบรรทัดเดียวโดยไม่ต้อง./อยู่ข้างหน้า?
Levon

นี่เป็นเหตุผลทางด้านเครื่องสำอาง / ความงามหรือคุณพยายามทำอะไรบางอย่างกับผลลัพธ์
jw013

คำตอบ:


42

ด้วย GNU findคุณสามารถใช้-printfตัวเลือก:

find . -maxdepth 1 -type d -printf '%f\n'

ตามที่ระบุไว้โดยPawełในความคิดเห็นหากคุณไม่ต้องการให้ไดเรกทอรีปัจจุบันอยู่ในรายการเพิ่ม-mindepth 1เช่น:

find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'

ฉันไม่สามารถหาเอ่ยถึงใด ๆ-printfตัวเลือกในPOSIX สเปคล่าสุดและผมสงสัยว่ามันเป็นแบบพกพา ...
rahmu

@rahmu: นี่คือการทดสอบกับ GNU พบ ไม่มีprintfตัวเลือกที่กล่าวถึงโดย POSIX และพวกเขาดูเหมือนจะไม่ได้รับการสนับสนุนโดยบางส่วนของอื่น ๆfindรุ่น GNU find สามารถติดตั้งได้ในสถานที่ส่วนใหญ่ดังนั้นในแง่นี้มันพกพาได้
ธ.ค.

1
เพิ่ม-mindepth 1ถ้าคุณต้องการกำจัด.
PawełPrażak

18

ปรับปรุง:

ทางเลือกที่สั้นกว่า:

 find . -maxdepth 1 -type d | cut -c 3-

จะให้ชื่อคุณหนึ่งชื่อต่อหนึ่งบรรทัดโดยไม่มีเครื่องหมายทับ


4
@ downvoter .. downvote ที่ไม่มีคำอธิบายไม่ได้ช่วยใคร (OP, SO หรือฉัน) นี่เป็นโซลูชันที่ใช้งานได้สำหรับคำถามของ OP ฉันยินดีที่จะแก้ไขข้อผิดพลาดหากชี้ให้เห็นหรือปรับปรุงคำตอบ แต่ต้องมีการตอบกลับเชิงสร้างสรรค์มากกว่าแค่คลิก "ไม่ระบุชื่อ"
Levon

1
ผมคนหนึ่งที่ downvoted lsเมื่อคำตอบของคุณรวมถึงการแยก ในขณะเดียวกันฉันโพสต์ลิงก์ว่าทำไมความคิดที่ไม่ดีเกี่ยวกับคำตอบอื่นที่ถูกลบตั้งแต่นั้น ในเวลานั้นมีเพียง 2 คำตอบและเหตุผลก็ชัดเจน ฉันดีใจที่คุณชี้ให้เห็นความกำกวมและนี่คือคำอธิบายของฉัน สำหรับบันทึกฉันเปลี่ยน downvote เป็น upvote เพราะฉันเห็นด้วยกับคำตอบปัจจุบันของคุณ
rahmu

@rahmu การให้คำอธิบายสำหรับ downvote ของคุณในคำถามอื่นนั้นไม่มีประโยชน์กับฉัน (และเห็นได้ชัดกับคุณเท่านั้น) นอกจากนี้ในขณะที่นี่เป็นทางออกที่ดีกว่าโซลูชันที่ฉันโพสต์ก่อนทำงานได้ดี (ใช่ฉันคุ้นเคยกับลิงก์ "ไม่ใช้ ls" ของคุณ - แต่มันไม่ได้ใช้อย่างสุ่มสี่สุ่มห้าในทุกกรณี) หากคุณมีตัวอย่างที่เคาน์เตอร์สำหรับสาเหตุที่วิธีแก้ปัญหาเริ่มต้นของฉันไม่ทำงานฉันชอบที่จะรู้ (เพื่อที่ฉันจะได้เรียนรู้อะไรบางอย่างจากสิ่งนี้) มิฉะนั้นคุณเพียงแค่โพสต์ลิงค์และไม่เสนอสิ่งที่สร้างสรรค์
Levon

พิจารณาว่ามีชื่อ\nในไดเรกทอรีที่คุณไม่สามารถใช้ cut เพื่อดึงข้อมูลได้ (ซึ่งเป็นสิ่งที่คุณทำเมื่อฉันลงคะแนนให้คุณ) มีบางกรณีที่lsไม่มีพฤติกรรมที่อันตรายและเกือบจะปลอดภัยกว่าที่จะใช้วิธีอื่นเสมอ
rahmu

9

การใช้ GNU find คุณสามารถใช้ -mindepth เพื่อป้องกันการค้นหาจากการจับคู่ไดเรกทอรีปัจจุบัน:

find . -type d -maxdepth 1 -mindepth 1

เนื่องจากคุณไม่ได้ทำสิ่งนี้ซ้ำ ๆ คุณสามารถใช้ bash glob:

echo */

การเพิ่มการต่อท้าย / ไปยัง glob จะทำให้ไดเรกทอรีเท่านั้นที่จะจับคู่


1
*/คิดถึงจุดไฟล์และรวมถึงการเชื่อมโยง สิ่งนี้อาจจะใช่หรือไม่ใช่ปัญหา
Gilles 'หยุดความชั่วร้าย' ใน

@Gilles - มันจะพลาด symlink เสมอ แต่ dotfiles นั้นขึ้นอยู่กับว่า dotglob ตั้งอยู่หรือไม่
จอร์แดน



2

ฉันมักจะใช้:

find * -type d

แต่ฉันไม่รู้ว่ามันเป็นวิธีที่ถูกต้องในการทำสิ่งที่คุณต้องการหรือไม่


1
หากคุณจะปล่อยให้เชลล์ขยายชื่อไฟล์ทั้งหมดทำไมต้องใช้ find เลย
จอร์แดน

@jordanm เพื่อเลือกเฉพาะไดเรกทอรี echo */จะทำสิ่งเดียวกันมากกว่าหรือน้อยกว่า (เพราะคิดถึงจุดไฟล์และมี symlink) แต่จากนั้นโจอาคิมจะถามว่าจะลบไฟล์สุดท้าย/ออกได้อย่างไร
Gilles 'หยุดชั่วร้าย'

0

ใน AIX พารามิเตอร์ 'maxdepth' ไม่ทำงาน

โดยทั่วไปแล้วสิ่งนี้ใช้ได้กับฉัน:

find ./ -type d | cut -d"/" -f2 | sort -u


0

สิ่งที่คุณกำลังมองหาเรียกว่าbasenameมันไม่สนใจโครงสร้างไดเรกทอรี unix

ตัวอย่างด้านล่าง:

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

มันจะแยกเอาท์พุทแม้เส้นทาง dir เอาความจำเป็นcd ก่อนที่จะเรียกใช้คำสั่ง


ข้อมูล aditional บางส่วน:

ฉันจะส่งผ่าน-execเป็นอาร์กิวเมนต์เพื่อค้นหาแทน|(ไพพ์) คำสั่งอื่นสำหรับเอาต์พุต (หลีกเลี่ยงคำสั่งที่สองข้ามแต่ละบรรทัดเอาต์พุตโดยกล่าวว่าขึ้นอยู่กับเอาต์พุตที่สามารถปรับปรุงประสิทธิภาพการทำงานของสคริปต์)

หมายเหตุ: findตัวเลือก ไม่ได้ตำแหน่ง (-maxdepth ส่งผลกระทบต่อการทดสอบที่ระบุไว้ก่อนหน้านี้เช่นเดียวกับที่ระบุไว้หลังจากนั้น)

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