Katakan `ls` untuk hanya mencetak nama file dasar

21

Ini adalah perilaku default dari 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

Bagaimana cara saya lsmencetak hanya nama dasarnya? Suka:

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

Catatan : Saya lebih suka shell globbing daripada menggunakan findsebagai / net / nas / data / bahasa / pypm / situs / rex / gratis berisi sejumlah besar file dan direktori.

Srid mengatakan Reinstate Monica
sumber
1
Anda lebih suka shell globbing OVER menggunakan find ketika direktori berisi banyak file? salah ketik??
akira
1
Saya menduga bahwa OP tidak ingin daftar subdirektori, dan tidak mengetahui opsi untuk beralih -maxdepth 1ke find.
intuited

Jawaban:

19

Sementara xargs -0dimaksudkan untuk digunakan untuk input yang dibatasi oleh \ 0 (seperti find -print0), lstidak memiliki opsi untuk membatasi outputnya dengan cara ini.

Namun,

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

akan melakukan trik untuk mengubah baris baru ke nol di sepanjang jalan. Ini kemudian memungkinkan xargs untuk bekerja dengan nama-nama yang memiliki spasi.

EDIT: ditambahkan -n 1ke xargs

Steve Folly
sumber
Ini tidak berfungsi untuk saya: basename: extra operand \ 033 [0m / net / nas / data / bahasa / pypm / situs / rex / gratis / 2.6 / macosx / pool / v / vi / virtualenv-1.4.4_macosx_2.6_1.pypm \ 033 [ 0m'`
Srid berkata Reinstate Monica
@ Sridhar: Anda mungkin membutuhkan -n 1saran Anda di tempat lain sebagai pilihan xargs? (jawaban diedit)
Steve Folly
Meskipun saya pribadi lebih suka jawaban saya sendiri (karena saya hampir tidak pernah harus berurusan dengan spasi dalam nama file), saya akan menandai ini sebagai jawaban untuk itu juga menangani spasi.
Srid berkata Reinstate Monica
Jika versi mac xargs mendukung opsi -d(pembatas), Anda dapat melakukannya ls ... | xargs -d '\n' -n 1 basename.
intuited
12

Saya menggunakan ini:

ls | tr '\n' '\n'

Ini memberikan daftar seperti:

file1.mp3
file2.mp3
file3.mp3
...
arrayown
sumber
3
Ini pada dasarnya sama dengan ls -1(dan pewarnaan dinonaktifkan), seperti yang lstersirat ketika tidak menulis ke terminal. Sepertinya Anda sedikit kehilangan poinnya, karena masalahnya adalah menelanjangi nama dir saat menentukan lsargumen path menggunakan wild card. Coba ls -d "$PWD/"* | tr '\n' '\n'lihat apa masalah sebenarnya.
Daniel Beck
-1 - tidak yakin mengapa orang terus menjawab jawaban ini. Tidak hanya melakukan hal yang sama ls -1, tetapi juga tidak berfungsi ketika gumpalan telah digunakan, seperti yang ditunjukkan Daniel Beck.
slhck
-1 - Ini sama dengan ls -1, dan hanya berfungsi di direktori saat ini, bukan dengan path seperti ls path/*.
Brendan Byrd
5
ls -1 <path> | sed 's#.*/##'
mpez0
sumber
AH! Akhirnya sesuatu yang bekerja dengan banyak argumen!
Aurélien Ooms
4

awk larutan:

ls -1 /path/glob | awk -F'/' '{print $NF}'
Amnon
sumber
2

ls [jalur opsional] | xargs -0 basename

Glen Y.
sumber
2
-1: ls tidak dapat membatasi nama dengan \ 0 yang xargs -0dicari.
Steve Folly
2

Kedua basename GNU dan FreeBSD basename menerima -aargumen yang memungkinkan Anda untuk melewati beberapa jalan untuk perintah. Ini bekerja sangat baik dengan shell globbing.

basename -a /path/glob*
as
sumber
1

Anda bilang Anda lebih suka globbing find, tetapi apakah Anda tahu bahwa keduanya tidak eksklusif? Globbing terjadi pada perintah yang Anda jalankan, bukan hanya ls. Sebagai contoh:

$ 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

Perhatikan bahwa contoh find dapat menggunakan -print0 yang berguna jika path Anda mengandung spasi putih ( trsolusi berbasis yang disebutkan di tempat lain bekerja sangat baik pada ruang normal, tetapi tidak pada file yang berisi baris baru aktual).

Terakhir, jika Anda memiliki akses ke GNU find, Anda juga dapat menggunakan -printf yang menghindari panggilan basename sama sekali:

$ find $BASE/*/pool/v/vi/virtual*1.4.4*pypm -printf '%f\n'
Ryan Bright
sumber
Sayangnya, -printfopsi tidak tersedia dalam versi MacOSX find.
Srid berkata Reinstate Monica
Panggilan yang bagus; permintaan maaf atas pengawasannya. Saya sudah memperbarui jawabannya.
Ryan Bright
-3

buka direktori tempat Anda memiliki semua file dan ketik.

find *.pypm
keadilan
sumber
1
OP secara eksplisit menyatakan bahwa dia tidak ingin menggunakan find.
gronostaj
1
Juga, ini bahkan tidak melakukan apa yang dibutuhkan OP. (Catatan: Anda harus menggunakan find . -name '*pypm'jika sama sekali ... hanya menempatkan gumpalan di sebelah untuk menemukan tidak mencapai apa-apa - maka Anda hanya bisa menulis ls *.pypm.)
slhck