บอก `ls 'เพื่อพิมพ์เฉพาะชื่อไฟล์ฐาน


21

นี่คือพฤติกรรมเริ่มต้นของ ls

ls /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86/pool/v/vi/virtualenv-1.4.4_linux-x86_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/linux-x86_64/pool/v/vi/virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/macosx/pool/v/vi/virtualenv-1.4.4_macosx_2.6_1.pypm
/net/nas/data/languages/pypm/sites/rex/free/2.6/win32-x86/pool/v/vi/virtualenv-1.4.4_win32-x86_2.6_1.pypm

ฉันจะlsพิมพ์เฉพาะชื่อฐานได้อย่างไร ชอบ:

ls $OPTIONS /net/nas/data/languages/pypm/sites/rex/free/2.6/*/pool/v/vi/virtual*1.4.4*pypm
virtualenv-1.4.4_linux-x86_2.6_1.pypm
virtualenv-1.4.4_linux-x86_64_2.6_1.pypm
virtualenv-1.4.4_macosx_2.6_1.pypm
virtualenv-1.4.4_win32-x86_2.6_1.pypm

หมายเหตุ : ฉันชอบเชลล์มากกว่าที่จะใช้findเป็น / net / nas / data / languages ​​/ pypm / sites / rex / free ซึ่งมีไฟล์และไดเรกทอรีจำนวนมาก


1
คุณชอบเชลล์ globbing มากกว่าโดยใช้การค้นหาเมื่อไดเรกทอรีมีไฟล์จำนวนมากหรือไม่ typo ??
กิระ

1
ฉันคาดเดาว่า OP ไม่ต้องการรายชื่อของไดเรกทอรีย่อยและไม่ทราบถึงตัวเลือกในการผ่านไป-maxdepth 1 find
สัญชาตญาณ

คำตอบ:


19

ในขณะที่xargs -0ตั้งใจจะใช้สำหรับการคั่นด้วยอินพุตโดย \ 0 (เหมือนfind -print0) lsไม่มีตัวเลือกดังกล่าวเพื่อกำหนดเขตเอาท์พุทด้วยวิธีนี้

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

ls -1 /path/glob | tr '\n' '\0' | xargs -0 -n 1 basename

จะทำเคล็ดลับในการแปลงบรรทัดใหม่เป็นโมฆะไปพร้อมกัน สิ่งนี้อนุญาตให้ xargs ทำงานกับชื่อที่มีช่องว่าง

แก้ไข: เพิ่ม-n 1ใน xargs


สิ่งนี้ไม่ได้ผลสำหรับฉัน: basename: extra operand \ 033 [0m / net / nas / data / languages ​​/ pypm / sites / rex / free / 2.6 / macosx / pool / v / vi / virtualenv-1.4.4_macosx_2.6_1.pypm \ 033 [ 0m'`
Srid พูดว่า Reinstate Monica

@ Sidhar: คุณอาจต้องการให้-n 1คุณแนะนำที่อื่นเป็นตัวเลือกได้xargsหรือไม่ (แก้ไขคำตอบ)
Steve Folly

แม้ว่าโดยส่วนตัวแล้วฉันชอบคำตอบของตัวเอง (เนื่องจากแทบจะไม่ต้องรับมือกับช่องว่างในชื่อไฟล์) แต่ฉันจะทำเครื่องหมายคำตอบนี้เป็นคำตอบสำหรับจัดการช่องว่างเช่นกัน
Srid พูดว่า Reinstate Monica

ถ้ารุ่น Mac ของ xargs สนับสนุน-d(คั่น) ls ... | xargs -d '\n' -n 1 basenameตัวเลือกที่คุณสามารถทำได้
intuited

12

ฉันใช้สิ่งนี้:

ls | tr '\n' '\n'

มันให้รายการเช่น:

file1.mp3
file2.mp3
file3.mp3
...

3
นี่เป็นสิ่งสำคัญเช่นเดียวกับls -1(และปิดการใช้งานการระบายสี) ซึ่งlsหมายถึงสิ่งเหล่านั้นเมื่อไม่ได้เขียนลงในเทอร์มินัล ดูเหมือนว่าคุณกำลังพลาดจุดเล็กน้อยเนื่องจากปัญหาคือการลอกชื่อ dir เมื่อระบุlsอาร์กิวเมนต์พา ธ โดยใช้ wild cards ลองls -d "$PWD/"* | tr '\n' '\n'ดูว่าปัญหาที่แท้จริงคืออะไร
Daniel Beck

-1 - ไม่แน่ใจว่าทำไมคนถึงเลือกคำตอบนี้ต่อไป มันไม่เพียงทำในสิ่งเดียวกันเท่านั้น แต่ls -1มันยังใช้งานไม่ได้เมื่อมีการใช้งานถุงมือตามที่ Daniel Beck ชี้ให้เห็น
slhck

-1 - นี่เป็นเช่นเดียวกับls -1และใช้ได้เฉพาะในไดเรกทอรีปัจจุบันไม่ใช่เส้นทางเช่นls path/*นั้น
เบรนแดนเบิร์ด




2

ทั้งGNU basenameและFreeBSD basenameยอมรับ-aอาร์กิวเมนต์ที่อนุญาตให้คุณส่งหลาย ๆ พา ธ ไปยังคำสั่ง ใช้งานได้ดีกับเปลือกแบบกลม

basename -a /path/glob*

1

คุณบอกว่าคุณชอบที่นิยมมากกว่าfindแต่คุณรู้หรือไม่ว่าทั้งสองนั้นไม่ได้เกิดขึ้นพร้อมกัน globbing ที่เกิดขึ้นในคำสั่งใด ๆ lsที่คุณทำงานไม่ได้เป็นเพียง ตัวอย่างเช่น:

$ export BASE=/net/nas/data/languages/pypm/sites/rex/free/2.6

$ echo $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ ls $BASE/*/pool/v/vi/virtual*1.4.4*pypm | xargs basename
$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -print0 | xargs -0 basename

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

สุดท้ายถ้าคุณมีสิทธิ์เข้าถึง GNU คุณสามารถใช้ -printf เพื่อหลีกเลี่ยงการเรียก basename ทั้งหมด:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'

แต่น่าเสียดายที่-printfตัวเลือกที่ไม่สามารถใช้ได้ในรุ่น MacOSX findของ
Srid พูดว่า Reinstate Monica

โทรดี ขอโทษสำหรับการกำกับดูแล ฉันได้อัพเดตคำตอบแล้ว
Ryan Bright

-3

ไปที่ไดเรกทอรีที่คุณมีไฟล์ทั้งหมดและพิมพ์

find *.pypm

1
OP findประกาศอย่างชัดเจนว่าเขาไม่ต้องการที่จะใช้
gronostaj

1
นอกจากนี้ยังไม่ได้ทำสิ่งที่ OP ต้องการ (หมายเหตุ: คุณควรใช้find . -name '*pypm'ถ้าเลย ... เพียงแค่ใส่ glob ถัดไปที่จะหาอะไรที่ประสบความสำเร็จใน - แล้วคุณอาจจะเพียงแค่เขียนls *.pypm.)
slhck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.