Saya dapat membuat daftar semua direktori dengan
find ./ -type d
Saya mencoba membuat daftar isi setiap direktori dan menghitung jumlah file di setiap direktori dengan menggunakan perintah berikut
find ./ -type d | xargs ls -l | wc -l
Tapi ini menjumlahkan jumlah baris yang dikembalikan
find ./ -type d | xargs ls -l
Adakah cara untuk menghitung jumlah file di setiap direktori?
./
?Jawaban:
Dengan asumsi Anda memiliki GNU find, biarkan ia menemukan direktori dan biarkan bash melakukan sisanya:
sumber
find . -maxdepth 1 -type d | sort
; apakah y =find $x | wc -l
; echo $ x, $ y; selesaifind . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
$dir
harus di dalam tanda kutip di komentar pertama Anda untuk menangani nama dir dengan spasi putih dengan benar. :find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
Ini mencetak jumlah file per direktori untuk tingkat direktori saat ini:
sumber
du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c
. Tambahkan| sort -nr
untuk mengurutkan menurut hitungan, bukan nama direktori.find. -type f
untuk menemukan semua item dari file tipecut -d/ -f2
untuk memotong folder khusus merekasort
untuk mengurutkan daftar nama folderuniq -c
untuk mengembalikan berapa kali setiap nama folder telah dihitungsumber
find . -type f | cut -d/ -f2,3 | sort | uniq -c
Anda dapat mengatur untuk menemukan semua file, menghapus nama file, meninggalkan baris yang hanya berisi nama direktori untuk setiap file, dan kemudian menghitung berapa kali setiap direktori muncul:
Satu-satunya gotcha dalam hal ini adalah jika Anda memiliki nama file atau nama direktori yang berisi karakter baris baru, yang sangat tidak mungkin. Jika Anda benar-benar harus khawatir tentang baris baru dalam nama file atau nama direktori, saya sarankan Anda menemukannya, dan memperbaikinya sehingga tidak mengandung baris baru (dan diam-diam membujuk pihak yang bersalah atas kesalahan cara mereka).
Jika Anda tertarik dengan jumlah file di setiap sub-direktori dari direktori saat ini, menghitung file apa pun di sub-direktori apa pun bersama dengan file di sub-direktori langsung, maka saya akan menyesuaikan
sed
perintah untuk hanya mencetak direktori tingkat atas:Pola pertama menangkap awal nama, titik, garis miring, nama hingga garis miring berikutnya dan garis miring, dan menggantikan garis hanya dengan bagian pertama, jadi:
diganti dengan
Replace kedua menangkap file secara langsung di direktori saat ini; mereka tidak memiliki garis miring di bagian akhir, dan diganti dengan
./
. Sortir dan hitungan kemudian bekerja hanya pada jumlah nama.sumber
find
. Beberapa mungkin: jika ada filedir1/dir2/dir3/file1
, tetapidir1/dir2
hanya berisi sub-direktori (tidak ada file biasa), Anda dapat menyimpulkan keberadaannya. Tetapi jikadir1/dir4
tidak memiliki file, namanya tidak muncul.Inilah salah satu cara untuk melakukannya, tetapi mungkin bukan yang paling efisien.
Memberikan keluaran seperti ini, dengan nama direktori diikuti dengan jumlah entri dalam direktori tersebut. Perhatikan bahwa jumlah keluaran juga akan menyertakan entri direktori yang mungkin bukan yang Anda inginkan.
sumber
bash
,ls
,wc
) untuk setiap direktori ditemukan olehfind
.man bash
,A -- signals the end of options and disables further option processing
. Dalam kasus ini, ini akan mencegah file yang salah bernama yang ditemukan sebagai bagian dari pencarian menjadi bagian dari pemrosesan argumen untuk bash.Solusi setiap orang memiliki satu kelemahan atau lainnya.
Penjelasan:
-type d
: kami tertarik pada direktori.-readable
: Kami hanya menginginkannya jika memungkinkan untuk mencantumkan file di dalamnya. Perhatikan bahwafind
masih akan mengeluarkan kesalahan saat mencoba mencari lebih banyak direktori di dalamnya, tetapi ini mencegah pemanggilannya-exec
.-exec sh -c BLAH sh {} ';'
: untuk setiap direktori, jalankan fragmen skrip ini, dengan$0
set kesh
dan$1
setel ke nama file.printf "%s " "$1"
: cetak nama direktori secara portabel dan minimal, diikuti hanya dengan spasi, bukan baris baru.ls -1UA
: daftar file, satu per baris, dalam urutan direktori (agar pipa tidak terhenti), tidak termasuk hanya direktori khusus.
dan..
wc -l
: hitung garissumber
find -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
Versi jawaban Sebastian yang sedikit dimodifikasi menggunakan
find
alih-alihdu
(untuk mengecualikan overhead terkait ukuran file yangdu
harus dilakukan dan yang tidak pernah digunakan):-mindepth 2
parameter digunakan untuk mengecualikan file di direktori saat ini. Jika Anda menghapusnya, Anda akan melihat beberapa baris seperti berikut:(seperti
du
varian berbasis)Jika Anda juga perlu menghitung file dalam direktori saat ini, gunakan versi yang disempurnakan ini:
Outputnya akan seperti berikut:
sumber
Ini juga dapat dilakukan dengan mengulang ls daripada menemukan
for f in */; do echo "$f -> $(ls $f | wc -l)"; done
Penjelasan:
for f in */;
- mengulang semua direktorido echo "$f ->
- mencetak setiap nama direktori$(ls $f | wc -l)
- panggil ls untuk direktori ini dan hitung barissumber
for f ./* ; do echo $f $(ls "$f" | wc -l); done
Ini harus mengembalikan nama direktori diikuti dengan jumlah file di direktori.
Contoh keluaran:
The
export -f
diperlukan karena-exec
argumenfind
tidak memungkinkan melaksanakan fungsi pesta kecuali Anda menjalankan pesta eksplisit, dan Anda perlu untuk mengekspor fungsi yang didefinisikan dalam lingkup saat ini ke shell baru secara eksplisit.sumber
./dir1/dir2/dir3
(menghitung file didir1
dan subdirektorinya bersama-sama, daripada menghitung file secaradir1/dir2/dir3
terpisah dari yang ada didir1/dir2
dan keduanya secara terpisah dari yang ada di/dir1
).Saya menggabungkan jawaban @glenn jackman dan jawaban @ pcarvalho (di daftar komentar, ada yang salah dengan jawaban pcarvalho karena fungsi kontrol gaya ekstra dari karakter ' `` (backtick)).
Skrip saya dapat menerima path sebagai augument dan mengurutkan daftar direktori sebagai
ls -l
, juga dapat menangani masalah "spasi dalam nama file" .Jawaban pertama saya di stackoverflow, dan saya harap ini dapat membantu seseorang ^ _ ^
sumber
Temukan . -ketik f -printf '% h \ n' | urutkan | uniq -c
memberi contoh:
sumber
Saya mencoba dengan beberapa yang lain di sini tetapi berakhir dengan subfolder yang termasuk dalam jumlah file ketika saya hanya menginginkan file. Ini mencetak
./folder/path<tab>nnn
dengan jumlah file, tidak termasuk subfolder, untuk setiap subfolder di folder saat ini.sumber
Cara mudah untuk menemukan file dari jenis tertentu secara rekursif. Dalam kasus ini, file .jpg untuk semua folder di direktori saat ini:
find . -name *.jpg -print | wc -l
sumber
Perintah keajaiban super cepat, yang secara rekursif melintasi file untuk menghitung jumlah gambar dalam direktori dan mengatur keluaran dengan ekstensi gambar:
Penghargaan: https://unix.stackexchange.com/a/386135/354980
sumber
Ini bisa menjadi cara lain untuk menelusuri struktur direktori dan memberikan hasil yang mendalam.
sumber
Saya mengedit skrip untuk mengecualikan semua
node_modules
direktori di dalam direktori yang dianalisis.Ini dapat digunakan untuk memeriksa apakah jumlah proyek file melebihi jumlah maksimum yang dapat ditangani pengamat file.
Untuk memeriksa file maksimum yang dapat ditonton oleh sistem Anda:
node_modules
folder harus ditambahkan ke jalur yang dikecualikan IDE / editor Anda dalam sistem yang lambat, dan jumlah file lainnya idealnya tidak boleh melebihi jumlah maksimum (yang dapat diubah sekalipun).sumber
Ini akan memberikan hitungan keseluruhan.
sumber