วิธีแสดงรายการไฟล์ที่ขึ้นต้นด้วย“ a” หรือ“ c” จาก / etc [ปิด]


10

ฉันพยายามls /etc/[ac]*แต่มันแสดงไดเรกทอรีที่ขึ้นต้นด้วยaหรือcและเนื้อหาทั้งหมดไม่ใช่ไฟล์ที่ขึ้นต้นด้วย " a " หรือ " c "


ไดเรกทอรีเป็นหนึ่งในหลายประเภทของไฟล์ คุณสนใจไฟล์ประเภทใด (ปกติ, symlink, อุปกรณ์, ไพพ์, ซอคเก็ต ... )?
Stéphane Chazelas

มันไม่ชัดเจนว่าคุณโดย "ไดเรกทอรี" กำลังพูดถึง เนื้อหาของไดเรกทอรีหรือเกี่ยวกับชื่อไดเรกทอรีเอง คำสั่งที่คุณแสดงจะแสดงรายการเนื้อหาของไดเรกทอรีที่ตรงกับรูปแบบโดยที่ls -d /etc/[ac]*คุณจะไม่ได้รับเนื้อหาของไดเรกทอรีที่ตรงกัน แต่จะยังคงเห็นชื่อไดเรกทอรี มันไม่ชัดเจนว่านี่คือสิ่งที่คุณต้องการหรือถ้าคุณต้องการที่จะหลีกเลี่ยงแม้แต่รายชื่อไดเรกทอรี
Kusalananda

คำตอบ:


23

เพื่อหลีกเลี่ยงการแสดงรายการเนื้อหาของไดเรกทอรีคุณสามารถ:

ls -d /etc/[ac]*

ที่จะแสดงรายการไดเรกทอรีชื่อพร้อมกับชื่อไฟล์ธรรมดาที่เริ่มต้นด้วยหรือac

เพื่อความสมบูรณ์โซลูชันที่ไม่เกี่ยวข้องfindอาจเป็น:

ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9

การอ่านคำถามเริ่มแรกของฉันก็ls -dดูเหมาะสมเช่นกัน แต่ดูเหมือนว่าคำถามดั้งเดิมระบุว่าไม่ควรมีรายการไดเรกทอรีโดยไม่คำนึงถึงส่วนขยายหรือไม่ใช่ส่วนขยาย
Chris Down

1
ls -ld /etc/[ac]* | grep ^- | tr -s ' ' | cut -d' ' -f9lsไม่ได้แยก
Avinash Raj

1
@AvinashRaj: ความเกี่ยวข้องของคำแนะนำนั้นขึ้นอยู่กับว่าใครต้องการวิธีนี้ในการทำงานเพียงครั้งเดียวหรือตลอดไป ถ้าเพียงครั้งเดียวการแยกวิเคราะห์lsเป็นเกมที่ยุติธรรมในความคิดของฉัน
Greg Hewgill

3
เขามีประเด็น ในขณะที่ชื่อใน/etcมีแนวโน้มที่จะมีสติสัมปชัญญะช่องว่างที่เรียบง่ายจะทำลายlsวิธีการเนื่องจากตัวเลขฟิลด์จะเปลี่ยน +1 สำหรับls -ldแม้ว่า
terdon

1
นอกจากนี้คุณยังต้องแก้ไขสถานที่ ( LC_ALL=C) วันที่ไม่รับประกันว่าจะมี 3 ฟิลด์ในสถานที่อื่น
Stéphane Chazelas

7

ซ้ำ:

find /etc -type f -name '[ac]*'

หากคุณต้องการการไม่เรียกซ้ำคุณสามารถทำได้ดังนี้:

find /etc/. ! -name . -prune -type f -name '[ac]*'

หรือสิ่งนี้ไม่ใช่พอร์ต (GNU หรือ BSD find ล่าสุด):

find /etc -type f -maxdepth 1 -name '[ac]*'

หากคุณต้องการที่จะทำกรณีนี้ insensitively ใช้แทน-iname-name


1
ทราบว่า-type fเป็นไฟล์ปกติ หากคุณต้องการไฟล์ที่ไม่ใช่ไดเรกทอรีให้แทนที่ด้วย! -type d(หรือ! -xtype dกับ GNU findหากคุณต้องการยกเว้นการเชื่อมโยงไปยังไดเรกทอรีด้วย)
Stéphane Chazelas

1

คุณอาจลองใช้คำสั่งนี้เช่นกัน

for file in /etc/[ac]*; do echo $file; done | xargs file | awk -v FS=" +" '$2~/directory/ {next;} {print $1}' | sed 's|\/etc\/||g;s/://g'

1

หากคุณต้องการทั้งไดเรกทอรี (ไม่ใช่เนื้อหาของไดเรกทอรี) และไฟล์คุณสามารถใช้printfbultin:

printf "%s\n" [ac]*

ตัวอย่าง:

$ printf "%s\n" [te]*
examples.desktop
teamviewer_linux.deb
test.php
test.txt

วิธีนี้จะหลีกเลี่ยงไดเรกทอรีตามที่ร้องขอในคำถามหรือไม่
Chris Down

โอ้ฉันอ่านผิด ฉันคิดว่า OP ต้องการไดเรกทอรี แต่ไม่ใช่เนื้อหา
cuonglm

ขออภัยเกี่ยวกับการแก้ไขที่อ่านผิดทั้งหมด
terdon

1

ไม่เวียนเกิดโดยไม่มีfind:

ls -pd /etc/[ac]* | grep -v '/$'

-pเพิ่ม/ที่สิ้นสุดสำหรับไดเรกทอรีที่grepกรองออก แน่นอนว่าใช้ไม่ได้กับชื่อไฟล์ที่มีอักขระพิเศษเช่นบรรทัดใหม่


1

ด้วยzsh:

print -rl /etc/[ac]*(.)

จะแสดงรายการปกติไฟล์ (ในขณะที่-type fในfind) ระบุไว้ใน/etcที่มีชื่อเริ่มต้นด้วยหรือa ส่วนหนึ่งในตอนท้ายของ glob ที่เป็นคุณลักษณะ zsh เฉพาะที่เรียกว่า globbing รอบคัดเลือก ในฐานะที่เป็นผู้คัดเลือกรอบคัดเลือกc(xxx).แฟ้มปกติ

หาก glob ไม่ตรงกันzshจะยกเลิกคำสั่ง ทราบว่าในอื่น ๆ เหมือนบอร์นหอยถ้า glob ไม่ตรงกับรูปแบบขยายตัวเองเพื่อให้ls -d /etc/[ac]*ไม่ถูกต้องสามารถรายการไฟล์ที่เรียกว่า/etc/[ac]*ถ้ามีไฟล์ไม่เริ่มต้นด้วยaหรือในc/etc

print -rl /etc/[ac]*(^/)

จะแสดงรายการไฟล์ที่ไม่ใช่ไดเรกทอรีประเภทและ

print -rl /etc/[ac]*(-^/)

จะแสดงรายการไฟล์ที่ไม่ใช่ไดเรกทอรีประเภทหลังจากแก้ไข symlink


-3

สำหรับไฟล์ที่แสดงเริ่มต้นด้วย:

ls etc |  grep ^a

สำหรับการแสดงไฟล์ที่ขึ้นต้นด้วย c:

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