Jika saya mengetik:
ls source/*
source/fonts:
fontello
source/images:
bg1.png eng.png fra.png
Saya mendapatkan daftar file, dikelompokkan berdasarkan nama folder. Bagaimana saya bisa mendapatkan daftar nama file?
ls source/*
source/fonts/fontello
source/images/bg1.png
source/images/eng.png
source/images/fra.png
Terima kasih
find
salah juga; terutama, jika Anda menjalankanfor file in $(find ...)
, Anda telah memukul salah satu dari mereka).Jawaban:
Tampaknya tidak mungkin terjadi tanpa perubahan output, tetapi di sini ada cara alternatif yang mudah:
Atau (khusus untuk GNU find), hanya untuk mendapatkan file pada kedalaman pertanyaan Anda:
(atau jika Anda ingin direktori seperti
ls
memberi Anda, hapus-type f
)sumber
Anda dapat tetap menggunakan ls jika Anda menambahkan beberapa psychedlics (
ls -d
):sumber
find
merupakan binatang gemuk.Anda mungkin tertarik pada "orang miskin
find
":shopt -s
s ets opsi shell bernama. Theglobstar
pilihan didefinisikan sebagai berikut di bash (1) :Jadi, setelah Anda selesai
shopt -s globstar
, salah satu dari perintah berikut:akan menghasilkan output:
Sayangnya, ini termasuk nama direktori juga. Mungkin sedikit membantu Anda untuk mengetahui hal itu
akan menghasilkan output:
yaitu, hanya nama direktori. Anda mungkin mengarahkan output dari salah satu set pertama perintah untuk satu file, mengarahkan output di atas ke file kedua, dan kemudian menggunakan
comm
,diff
atau sesuatu yang mirip, untuk mengurangi file kedua dari yang pertama, hanya menyisakan dataran file (non-direktori). Tapi jangan lakukan itu.Pendekatan lain (itu tidak jauh lebih baik) adalah
The
--file-type
pilihan memberitahuls
untuk menampilkan/
pada akhir setiap nama direktori (dan karakter lain di ujung lainnya (khusus) jenis file), seperti ini:dan kemudian
grep -v '/$'
menghapus garis yang diakhiri dengan/
; yaitu, nama direktori. Sayangnya,--file-type
opsi ini tidak ditentukan oleh POSIX . Jika versils
Anda tidak mendukungnya, gunakan-F
. Itu seperti--file-type
kecuali itu juga menampilkan a*
di ujung nama file executable, yang beberapa orang merasa menjengkelkan. Anda dapat menghilangkannya dengansed
:Jika Anda ingin melakukan sesuatu dengan semua file (dan hanya file), Anda dapat melakukannya
Catatan:
ls
mengeluarkan ke terminal, dan itu tidak dalam mode-l
( l ong), itu menulis beberapa nama per baris (kecuali nama-nama sangat panjang). Anda dapat memaksanya untuk menulis satu nama per baris dengan menentukan-1
(satu), atau dengan mengarahkan output ke file atau pipa.--
dalamls
perintah karena Anda daftar direktori yang isinya Anda buat. Anda harus menggunakannya saat mendaftar*
di direktori yang tidak dikenal, sebagai perlindungan terhadap nama file yang dimulai dengan-
.ls
.globstar
pilihan shell tampaknya tidak didefinisikan oleh POSIX. (Faktanya, saya tidak yakin POSIX mengenali opsi shell apa pun .) Meskipun sepertinyabash
isme, waspadalah - ini mungkin tidak ada di semua versi bash.Jika
fonts
atauimages
memiliki subdirektori,**
akan mendaftar semuanya, secara rekursif, sepenuhnya. Salah satu (agak kotor dan tidak dapat diandalkan) cara untuk membatasi kedalaman adalahyang menghilangkan garis yang mengandung tiga
/
karakter atau lebih .sumber