Tampaknya tidak mungkin tanpa perubahan keluaran, tetapi berikut adalah cara alternatif yang mudah:
find source/ -type f
Atau (khusus untuk penemuan GNU), untuk hanya mendapatkan file pada kedalaman pertanyaan Anda:
find source/ -type f -mindepth 2 -maxdepth 2
(atau jika Anda menginginkan direktori seperti ls
memberi Anda, hapus -type f
)
Anda dapat tetap menggunakan ls jika Anda menambahkan beberapa psychedlics (ls -d
):
# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*
A/file B/file C/file
Anda mungkin tertarik dengan “find
orang miskin itu ”:
shopt -s globstar
shopt -s
s ets opsi shell bernama. globstar
opsi didefinisikan sebagai berikut dalam bash(1):
Jika disetel, polanya
**
digunakan dalam konteks perluasan nama file/nama jalurakan cocok dengan file [sic] dan nol atau lebih direktori dan subdirektori. Jika pola diikuti oleh/
, hanya direktori dan subdirektori yang cocok.
Jadi, setelah Anda selesai shopt -s globstar
, salah satu dari perintah berikut:
ls -d1 -- source/** # The character after the ‘d’ is the digit one. ls -d -- source/** | cat # i.e., it will write that into a pipe to any command. printf "%s\n" source/**
akan menghasilkan output:
source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png
Sayangnya, ini termasuk nama direktori juga. Ini mungkin membantu Anda sedikit untuk mengetahui itu
printf "%s\n" source/**/
akan menghasilkan output:
source/
source/fonts
source/images
yaitu, hanya nama direktori. Anda dapat mengarahkan output dari salah satu rangkaian perintah pertama ke satu file, mengarahkan output di atas ke file kedua, lalu menggunakan comm
, diff
, atau yang serupa, untuk mengurangi file kedua dari yang pertama, hanya menyisakan file biasa (non-direktori). Tapi jangan lakukan itu.
Pendekatan lain (itu tidak banyak lebih baik) adalah
ls -d --file-type -- source/** | grep -v '/$'
--file-type
opsi memberi tahu ls
untuk menampilkan /
di akhir setiap nama direktori (dan karakter lain di akhir tipe file (khusus) lainnya), seperti ini:
source// # Added an extra one source/fonts/ # Added one source/fonts/fontello source/images/ # Added one source/images/bg1.png source/images/eng.png source/images/fra.png
lalu grep -v '/$'
menghapus baris yang diakhiri dengan /
;yaitu, nama direktori. Sayangnya, --file-type
opsi tidak ditentukan oleh POSIX. Jika versi ls
Anda tidak mendukungnya, gunakan -F
. Itu seperti --file-type
kecuali itu juga menampilkan *
di akhir nama file yang dapat dieksekusi, yang menurut sebagian orang mengganggu. Anda dapat menghilangkannya dengan sed
:
ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'
Jika Anda ingin melakukan sesuatu dengan semua file (dan hanya file), Anda dapat melakukannya
for f in source/** do if [ -f "$f" ] then Insert commands to be applied to plain files here. fi done
Catatan:
- Kapan
ls
sedang dikeluarkan ke terminal, dan tidak ada di-l
(l ong) mode, ia menulis banyak nama per baris (kecuali jika namanya sangat panjang). Anda dapat memaksanya untuk menulis satu nama per baris dengan menentukan-1
(satu), atau dengan mengalihkan keluaran ke file atau pipa. - Anda mungkin tidak benar-benar membutuhkan
--
dils
perintah karena Anda mencantumkan direktori yang isinya Anda buat. Anda harus menggunakannya saat mencantumkan*
di direktori yang tidak diketahui, sebagai perlindungan terhadap nama file yang dimulai dengan-
. - Jangan mencoba mengurai output dari
ls
. globstar
opsi shell tampaknya tidak ditentukan oleh POSIX. (Faktanya, saya tidak yakin POSIX mengenali apa pun Opsi shell.) Meskipun tampaknya menjadibash
isme, berhati-hatilah —itu mungkin tidak ada di semua versi bash.-
Jika
fonts
atauimages
memiliki subdirektori,**
akan mencantumkan semuanya, secara rekursif, sepenuhnya. Salah satu cara (agak kotor dan tidak dapat diandalkan) untuk membatasi kedalaman adalahls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
yang menghapus baris yang mengandung tiga atau lebih
/
karakter.