Apakah mungkin untuk menghapus folder prefix dari perintah `ls`


12

Saya menggunakan skrip bash dan saya ingin mendapatkan daftar semua file (misalkan semua file jar). Saya menjalankan perintah ls -1 lib/*.jardan saya mendapatkan output:

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

Apakah ada opsi untuk memiliki output berikut:

mylib_1.jar
mylib_2.jar
...

Membuat cd libsebelum bukan merupakan pilihan karena saya dalam satu lingkaran dan perlu berada di folder induk untuk tindakan yang ingin saya lakukan di dalam lingkaran.

Saya mencoba mencari informasi dengan mengetik man lstetapi saya tidak menemukan solusi.

Sebuah solusi dengan perintah lain akan bagus selama saya bisa mengirimkannya ke lsperintah saya atau cukup sendiri.


Apa yang kamu lakukan dengan nama file-file itu? Apakah Anda hanya mendaftarkannya ke terminal, atau Anda meneruskannya ke program atau skrip lain (secara individu atau sebagai daftar)? Cara yang benar untuk menangani ini tergantung pada bagaimana nama file digunakan.
Kusalananda

Idenya adalah untuk melakukan beberapa statistik tentang lib pihak ketiga pada proyek java multi-modul. Saya hanya ingin daftar dan membuat semacam dan uniq setelah
рüффп

Jawaban:


19

Alih-alih mem - parsing, Anda harus menggunakannya find. Kemudian Anda juga dapat mengeksekusi basenamepada setiap file untuk menghapus direktori terkemuka:

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

Ok, cara ini juga cocok untuk saya.
рüффп

3
Lihat juga -maxdepthopsi.

13

Dengan GNU findtidak perlu dijalankan basenameuntuk setiap file tunggal, ini akan jauh lebih cepat (terutama jika ada banyak file):

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

11

Bagaimana (cd lib && echo *.jar), dengan asumsi bahwa Anda tidak memiliki spasi atau karakter khusus dalam nama file. Script induk tidak pernah mengubah direktori.


Spasi juga tidak akan menjadi masalah.
terdon

Ini adalah ide yang bagus dan mungkin akan menjadi pilihan tercepat. Saya akan lakukan printf '%s\n' *.jaruntuk mendapatkan setiap file pada baris yang berbeda.
Graeme

Atau bahkan printf '%s\0' *.jaruntuk menghilangkan masalah spasi putih (meskipun ini bukan Q).
Graeme

5

Seperti yang dikatakan Josh Jolly dalam jawabannya, Anda jangan pernah menguraikan ls, gunakan pendekatan dalam jawabannya. Namun, berikut ini awksolusi untuk menghapus jalur dari nama file, hanya saja jangan gunakan dengan ls:

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

The -F'/'set pemisah lapangan untuk /yang berarti bahwa bidang terakhir, $NF, akan menjadi nama file.


1

findmungkin adalah cara untuk pergi, tetapi jika Anda benar-benar, benar-benar (Anda tidak) ingin menanggalkan lib/dari ls -1, Anda dapat menggunakan sed:

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

0

Anda dapat melakukan ini menggunakan xargs dengan parameter --max-args (atau alias lebih pendek -n):

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

Perhatikan bahwa kami menggunakan --quoting-style=cuntuk memastikan spasi dalam nama file tidak mengacaukan xargs.


Saya tidak memperhatikan itu. Terima kasih! Menemukan permata ini di pertukaran tumpukan lain. Anda dapat memperkenalkan kutipan ke hasil ls dengan --quoting-style = c. Jadi perintah lengkap yang dihasilkan adalah: `ls --quoting-style = c -1 lib / *. Jar | xargs --max-args 1 basename`
yoni

-1

Cara alternatif untuk menyelesaikan pertanyaan Anda adalah dengan mendaftar semua file yang digunakan ls -R. Gabungkan output dari perintah ls dengan grep ke daftar saja file .jar. Anda dapat menggunakan perintah berikut untuk melakukan hal yang sama untuk permintaan Anda:

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

Ini akan gagal jika ada subdirektori yang juga berisi file jar, atau file bernama misalnya "list-of-jars.txt".
Jules

grep -v jar * akan menyaring hasil dengan file bernama seperti contoh yang Anda kutip.
joshi.mohit86

benar. itu juga akan menyaring semua file yang dimaksud. Sekarang saya melihatnya lagi, saya tidak bisa melihat keadaan di mana perintah yang Anda sarankan benar-benar menghasilkan output sama sekali ...
Jules

Tidak, ini akan menampilkan file seperti mylib_2.jardan memfilter file seperti list-of-jars.txt.
joshi.mohit86

Tidak, tidak. Saya baru saja mencobanya. find development -name '*.jar' | wc -l-> 70. ls -R development | grep jar| grep -v jar*-> tidak ada output sama sekali.
Jules
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.