มีวิธีที่ถูกต้องในการแสดงรายการไดเรกทอรีย่อยของไดเรกทอรีปัจจุบันหรือไม่?


10

ฉันสามารถค้นหาไดเรกทอรีย่อยของไดเรกทอรีโดย

ls -d -- */

หรือ

ls -l | grep "^d"

แต่ทั้งคู่ดูเหมือนจะเป็นทางอ้อมและฉันคิดว่าจะมีวิธีมาตรฐานในการค้นหาเฉพาะไดเรกทอรี มีวิธีที่ถูกต้องในการทำเช่นนี้? และถ้าไม่เช่นนั้นสิ่งเหล่านี้จะนำไปสู่พฤติกรรมที่ไม่พึงประสงค์ในคดีขอบหรือไม่? (ลิงก์สัญลักษณ์ไดเรกทอรีที่ซ่อนอยู่ ฯลฯ )

คำตอบ:


17

คำตอบจะขึ้นอยู่กับสิ่งที่คุณตั้งใจจะทำกับผลลัพธ์มากกว่าสิ่งที่คุณกำลังมองหา หากคุณต้องการเห็นรายการสำหรับการอ้างอิงแบบเห็นภาพที่เทอร์มินัลวิธีแก้ปัญหาแรกของคุณก็ค่อนข้างดี หากคุณต้องการประมวลผลเอาต์พุตคุณควรพิจารณาใช้วิธีอื่น

findหนึ่งในวิธีที่มีประสิทธิภาพมากที่สุดที่จะได้รับรายชื่อในฟีดลงในโปรแกรมอื่นคือการใช้งาน

find -maxdepth 1 -type d

ด้วยเหตุนี้เป็นสิ่งที่ดีสำหรับฟีดคือการที่findการส่งออกสามารถข้อมูลแยกจากกันโดยใช้ nulls หรือต้องหลบหนีสตริงเป็นข้อโต้แย้งกับโปรแกรมอื่นโดยใช้-print0 -execสำหรับการอ้างอิงถึงสาเหตุที่ดีกว่าการแยกวิเคราะห์เอาต์พุตของ ls ให้ดูที่ParsingLSบน Wiki ของ Greg


4
ฉันต้องพิมพ์find . -maxdepth 1 -type dเพื่อให้มันทำงานบน OS X Yosemite
ฌอนเลวิน

1
ในรายการไดเรกทอรีย่อยหนึ่งมีการระบุ -mindepth find . -maxdepth 1 -mindepth 1 -type dในขณะที่ มิฉะนั้น.จะรวมไดเรกทอรีปัจจุบัน
tinlyx

5

FYI - ใน ZSH (แต่ไม่ใช่ BASH) คุณสามารถทำสิ่งนี้ได้: ls -d -- *(/); โมดิ(/)ฟายเออร์จะบอก ZSH ให้กับไดเรกทอรี glob เท่านั้น

ที่กล่าวว่าไม่แตกต่างจากโซลูชันที่คุณนำเสนอ ( ls -d -- */) และอยู่ไกลจากมาตรฐาน

เท่าที่การส่งออกของls(ซึ่งอาจแตกต่างกันขึ้นอยู่กับธงอื่น ๆ ):

% ls
dir0 dir1 dir2 file0 file1 file2
% ls -d -- */
dir0/ dir1/ dir2/
% ls -d -- *(/)
dir0 dir1 dir2

zsh ขยายเครื่องหมายดอกจันไปที่ไฟล์และไดเรกทอรีทั้งหมดธง (/) เลือกส่วนต่าง ๆ ของส่วนขยายนั้นดังนั้นls * (/)ก็สามารถใช้งานได้เช่นเดียวกับecho * (/)หรือวิธีพิมพ์ zshly เพิ่มเติม-l * (/ ) . รุ่นแรกที่สองยังทำงานในทุบตี
ธ อร์

1
โปรดทราบว่า*(/)ขยายไปยังไดเรกทอรีที่ไม่ถูกซ่อนในขณะที่*/ขยายไปยังไดเรกทอรีที่ไม่ถูกซ่อนหรือ symlink ไปยังไดเรกทอรี (หรืออย่างน้อย symlink ไปยังเส้นทางที่เราสามารถบอกได้ว่าเป็นไดเรกทอรี)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.