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.

рüффп
sumber
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 {} \;
Josh Jolly
sumber
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'
Graeme
sumber
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.

selesai24
sumber
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.

terdon
sumber
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

sumber
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.

yoni
sumber
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*
joshi.mohit86
sumber
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