Bash: ls * tanpa pengelompokan folder


12

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


Jika ini untuk penggunaan skrip, Anda mungkin ingin melihat mywiki.wooledge.org/ParsingLs . (Yang mengatakan, ada cara untuk menggunakan yang findsalah juga; terutama, jika Anda menjalankan for file in $(find ...), Anda telah memukul salah satu dari mereka).
Charles Duffy

Jawaban:


13

Tampaknya tidak mungkin terjadi tanpa perubahan output, tetapi di sini ada cara alternatif yang mudah:

find source/ -type f

Atau (khusus untuk GNU find), hanya untuk mendapatkan file pada kedalaman pertanyaan Anda:

find source/ -type f -mindepth 2 -maxdepth 2

(atau jika Anda ingin direktori seperti lsmemberi Anda, hapus -type f)


5

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

@ Cthulhu ok contoh saya terlalu pendek, Jika Anda memiliki folder di A, B a / o C -d membantu menampilkan hanya apa yang Anda pilih. Saya sebenarnya tidak suka menemukan dan Anda dapat mendefinisikan kedalaman dengan argumen dengan ls -d
ikrabbe

Saya telah menyarankan edit ke jawaban lain untuk membatasi kedalaman.
o11c

@ o11c sangat bagus, tetapi masih findmerupakan binatang gemuk.
ikrabbe

3

Anda mungkin tertarik pada "orang miskin find":

shopt -s globstar

shopt -s s ets opsi shell bernama. The globstarpilihan didefinisikan sebagai berikut di bash (1) :

Jika diatur, pola yang **digunakan dalam konteks ekspansi nama file / pathname akan cocok dengan file [sic] dan nol atau lebih direktori dan subdirektori. Jika polanya diikuti oleh /, hanya direktori dan subdirektori yang cocok.

Jadi, setelah Anda selesai shopt -s globstar, salah satu dari perintah berikut:

ls -d1 - source / **                  # Karakter setelah 'd' adalah digit. 
ls -d - source / ** | cat             # ie, ia akan menuliskannya ke dalam pipa untuk perintah apa pun 
sumber printf "% s \ n" / **

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. Mungkin sedikit membantu Anda untuk mengetahui hal itu

printf "%s\n" source/**/

akan menghasilkan output:

source/
source/fonts
source/images

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, diffatau 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

ls -d --file-type -- source/** | grep -v '/$'

The --file-typepilihan memberitahu lsuntuk menampilkan / pada akhir setiap nama direktori (dan karakter lain di ujung lainnya (khusus) jenis file), seperti ini:

sumber //                             # Menambahkan satu 
sumber tambahan / font /                        # Menambahkan satu
sumber / font / fontello
sumber / gambar /                       # Ditambahkan satu
sumber / gambar / bg1.png
sumber / gambar / eng.png
sumber / gambar / fra.png

dan kemudian grep -v '/$'menghapus garis yang diakhiri dengan /; yaitu, nama direktori. Sayangnya, --file-typeopsi ini tidak ditentukan oleh POSIX . Jika versi lsAnda 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 dengan sed:

ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'

Jika Anda ingin melakukan sesuatu dengan semua file (dan hanya file), Anda dapat melakukannya

untuk f dalam sumber / **
melakukan
    jika [-f "$ f"]
    kemudian
        Masukkan perintah untuk diterapkan ke file biasa di sini.
    fi
selesai

Catatan:

  • Ketika lsmengeluarkan 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.
  • Anda mungkin tidak benar-benar membutuhkan --dalam lsperintah 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 -.
  • Jangan mencoba mengurai output dari ls.
  • The globstarpilihan shell tampaknya tidak didefinisikan oleh POSIX. (Faktanya, saya tidak yakin POSIX mengenali opsi shell apa pun .) Meskipun sepertinya bashisme, waspadalah - ini mungkin tidak ada di semua versi bash.
  • Jika fontsatau imagesmemiliki subdirektori, **akan mendaftar semuanya, secara rekursif, sepenuhnya. Salah satu (agak kotor dan tidak dapat diandalkan) cara untuk membatasi kedalaman adalah

    ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
    

    yang menghilangkan garis yang mengandung tiga /karakter atau lebih .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.