เป็นไปได้ไหมที่จะลบคำนำหน้าโฟลเดอร์ออกจากคำสั่ง `ls`


12

ฉันอยู่ในสคริปต์ทุบตีและฉันต้องการได้รับรายชื่อของไฟล์ทั้งหมด (สมมติว่าไฟล์ jar ทั้งหมด) ฉันรันคำสั่งls -1 lib/*.jarและได้รับผลลัพธ์:

lib/mylib_1.jar
lib/mylib_2.jar
...

มีตัวเลือกใด ๆ ที่จะมีผลลัพธ์ต่อไปนี้:

mylib_1.jar
mylib_2.jar
...

การทำcd libก่อนไม่ใช่ตัวเลือกเนื่องจากฉันอยู่ในลูปและจำเป็นต้องอยู่ในโฟลเดอร์พาเรนต์สำหรับการกระทำที่ฉันต้องการทำภายในลูป

ฉันพยายามค้นหาข้อมูลด้วยการพิมพ์man lsแต่ไม่พบวิธีแก้ปัญหา

วิธีแก้ปัญหาที่มีคำสั่งอื่นจะดีตราบใดที่ฉันสามารถส่งไปยังlsคำสั่งหรือพอเพียงได้


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

แนวคิดคือการทำสถิติเกี่ยวกับ libs บุคคลที่สามในโครงการจาวาหลายโมดูล ฉันต้องการรายการและทำการเรียงลำดับและ uniq หลัง
рüффп

คำตอบ:


19

แทนที่จะแจง lsคุณควรใช้findแทน จากนั้นคุณสามารถดำเนินการbasenameกับแต่ละไฟล์เพื่อแยกไดเรกทอรีชั้นนำได้:

find lib/ -name '*.jar' -exec basename {} \;

ตกลงวิธีนี้เหมาะสำหรับฉันเช่นกัน
рüффп

3
ดู-maxdepthตัวเลือกเพิ่มเติม

13

ด้วย GNU findไม่จำเป็นต้องเรียกใช้basenameสำหรับทุก ๆ ไฟล์สิ่งนี้จะเร็วขึ้นมาก (โดยเฉพาะถ้ามีไฟล์จำนวนมาก):

find lib -name '*.jar' -printf '%P\n'

11

วิธีการเกี่ยวกับ(cd lib && echo *.jar)สมมติว่าคุณไม่ได้มีช่องว่างหรืออักขระพิเศษในชื่อไฟล์ สคริปต์ผู้ปกครองไม่เคยเปลี่ยนไดเรกทอรี


ช่องว่างจะไม่เป็นปัญหาเช่นกัน
terdon

นี่เป็นความคิดที่ดีและอาจเป็นตัวเลือกที่เร็วที่สุด ฉันจะทำอย่างไรprintf '%s\n' *.jarให้ไฟล์แต่ละไฟล์แตกต่างกัน
แกรม

หรือแม้กระทั่งprintf '%s\0' *.jarเพื่อขจัดปัญหาช่องว่าง (แม้ว่านี่ไม่ใช่ Q)
แกรม

5

ดังที่ Josh Jolly กล่าวไว้ในคำตอบของเขาคุณไม่ควรแยกวิเคราะห์lsใช้คำตอบของเขาแทน ยังนี่เป็นawkวิธีการลบเส้นทางจากชื่อไฟล์เพียงไม่ใช้กับ ls:

find . | awk -F'/' '{print $NF}'

-F'/'ชุดคั่นสนาม/ซึ่งหมายความว่าข้อมูลที่ผ่านมา$NFจะเป็นชื่อไฟล์


1

findอาจเป็นวิธีที่จะไป แต่ถ้าคุณจริง ๆ อยากทำ (คุณไม่) ต้องการตัดออกlib/จากls -1คุณสามารถใช้sed:

$ ls -1 lib/*.jar | sed 's#^lib/##'
mylib_1.jar
mylib_2.jar

0

คุณสามารถทำได้โดยใช้xargsด้วยพารามิเตอร์ --max-args (หรือนามแฝงที่สั้นกว่า -n):

ls --quoting-style=c -1 lib/*.jar | xargs --max-args 1 basename ls --quoting-style=c -1 lib/*.jar | xargs -n 1 basename

โปรดทราบว่าเราใช้--quoting-style=cเพื่อให้แน่ใจว่าช่องว่างในชื่อไฟล์ไม่ทำให้เสีย xargs


ฉันไม่ได้สังเกตว่า ขอบคุณ! พบอัญมณีนี้ในการแลกเปลี่ยนสแต็คอื่น คุณสามารถแนะนำราคาให้ ls ผลลัพธ์ได้ด้วย --quoting-style = c ดังนั้นคำสั่งเต็มรูปแบบที่เกิดขึ้นจะเป็น: `ls --quoting-style = c -1 lib / *. jar | xargs - max-args 1 basename`
yoni

-1

ls -Rทางเลือกในการแก้แบบสอบถามของคุณคือการรายการไฟล์ทั้งหมดโดยใช้ รวมเอาต์พุตของคำสั่ง ls กับ grep เพื่อแสดงรายการไฟล์. jar เท่านั้น คุณสามารถใช้คำสั่งต่อไปนี้เพื่อทำสิ่งเดียวกันสำหรับแบบสอบถามของคุณ:

ls -R lib | grep jar| grep -v jar*

สิ่งนี้จะล้มเหลวอย่างรุนแรงหากมีไดเรกทอรีย่อยที่มีไฟล์ jar หรือไฟล์ที่มีชื่อเช่น "list-of-jars.txt"
จูลส์

grep -v jar * จะกรองผลลัพธ์ด้วยไฟล์ที่มีชื่อเหมือนตัวอย่างที่ยกมาของคุณ
joshi.mohit86

จริง มันจะกรองไฟล์ที่ต้องการทั้งหมดด้วย ตอนนี้ผมมองไปที่มันอีกครั้งฉันสามารถดูไม่มีสถานการณ์ใดที่คำสั่งที่คุณแนะนำจริงจะผลิตออกใด ๆ เลย ...
จูลส์

ไม่มีก็จะแสดงไฟล์เหมือนและกรองไฟล์เช่นmylib_2.jar list-of-jars.txt
joshi.mohit86

ไม่เลย ฉันแค่ลองมัน -> find development -name '*.jar' | wc -l -> ไม่มีเอาต์พุตเลย 70ls -R development | grep jar| grep -v jar*
จูลส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.