Saya menggunakan skrip bash dan saya ingin mendapatkan daftar semua file (misalkan semua file jar). Saya menjalankan perintah ls -1 lib/*.jar
dan 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 lib
sebelum 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 ls
tetapi saya tidak menemukan solusi.
Sebuah solusi dengan perintah lain akan bagus selama saya bisa mengirimkannya ke ls
perintah saya atau cukup sendiri.
Jawaban:
Alih-alih mem - parsing, Anda harus menggunakannya
find
. Kemudian Anda juga dapat mengeksekusibasename
pada setiap file untuk menghapus direktori terkemuka:sumber
-maxdepth
opsi.Dengan GNU
find
tidak perlu dijalankanbasename
untuk setiap file tunggal, ini akan jauh lebih cepat (terutama jika ada banyak file):sumber
Bagaimana
(cd lib && echo *.jar)
, dengan asumsi bahwa Anda tidak memiliki spasi atau karakter khusus dalam nama file. Script induk tidak pernah mengubah direktori.sumber
printf '%s\n' *.jar
untuk mendapatkan setiap file pada baris yang berbeda.printf '%s\0' *.jar
untuk menghilangkan masalah spasi putih (meskipun ini bukan Q).Seperti yang dikatakan Josh Jolly dalam jawabannya, Anda jangan pernah menguraikan
ls
, gunakan pendekatan dalam jawabannya. Namun, berikut iniawk
solusi untuk menghapus jalur dari nama file, hanya saja jangan gunakan dengan ls:The
-F'/'
set pemisah lapangan untuk/
yang berarti bahwa bidang terakhir,$NF
, akan menjadi nama file.sumber
find
mungkin adalah cara untuk pergi, tetapi jika Anda benar-benar, benar-benar (Anda tidak) ingin menanggalkanlib/
darils -1
, Anda dapat menggunakansed
:sumber
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=c
untuk memastikan spasi dalam nama file tidak mengacaukan xargs.sumber
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:sumber
mylib_2.jar
dan memfilter file sepertilist-of-jars.txt
.find development -name '*.jar' | wc -l
->70
.ls -R development | grep jar| grep -v jar*
-> tidak ada output sama sekali.