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
lssedang 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
--dilsperintah 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. globstaropsi shell tampaknya tidak ditentukan oleh POSIX. (Faktanya, saya tidak yakin POSIX mengenali apa pun Opsi shell.) Meskipun tampaknya menjadibashisme, berhati-hatilah —itu mungkin tidak ada di semua versi bash.-
Jika
fontsatauimagesmemiliki 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.