daftar & urutkan subfolder berdasarkan jumlah item

2

Saya mencoba menulis skrip bash untuk mendaftar & mengurutkan subfolder berdasarkan jumlah item.

Inilah yang saya miliki:

find * | wc -l berfungsi untuk mengembalikan jumlah item.

Dan for f in *; do echo "$f"; find "$f" | wc -l ; doneberfungsi, tetapi daftarnya sulit untuk diurai.

Jadi saya mencoba menggunakan printf:

for f in *; do 
   c=`echo find "$f" | wc -l` ; 
   printf "$c $f\n"; 
done

Tetapi ia kembali 1untuk setiap subfolder.

Dan saya ingin mengurutkan daftar akhir berdasarkan jumlah item di setiap subfolder.

Dan
sumber

Jawaban:

1

Ini membuat saya penasaran, jadi saya mencobanya, ini kode saya:

#!/bin/bash

startIFS=$IFS
IFS=$'\n'

function echocount {
dirs=$(find -type d)
for f in $dirs; do
   c=$(find "$f" -maxdepth 1 -type f | wc -l) ;
   echo "$c $f";
done
}

echocount | sort -n

IFS=$startIFS

Saya menemukan ini sangat bodoh dan menjengkelkan dalam skrip shell, tetapi saya perlu mengubah IFS sehingga hanya baris baru dan bukan spasi yang menandakan direktori lain dan loop akan berjalan dengan benar.

BTW, dalam kode Anda, alasan selalu memiliki hitungan 1 adalah karena di echo find "$f" | wc -l, Anda sebenarnya menghitung baris echo find "$f", yang akan selalu menjadi satu baris (itu hanya menggema secara harfiah "menemukan apa pun", tidak benar-benar menjalankan perintah find ). Jika Anda mengambil echokeluar, itu akan melakukan apa yang Anda harapkan.

Juga, pedant akan memberi tahu Anda bahwa notasi backtick sudah usang. Saya menemukan notasi $ () lebih mudah dibaca.

localhost
sumber
Terima kasih! Ini bekerja untuk saya: for f in */; do c=$(find "$f" | wc -l) ; printf "$c $f\n"; done | sort(Belum pernah mendengar $()hal itu sebelumnya.) */Mengurangi hasil hanya ke direktori.
Dan
1

Dengan panduan dari localhost, solusi saya adalah:

for f in */; do 
  c=$(find "$f" | wc -l) ; 
  printf "$c $f\n"; 
done | sort -n
Dan
sumber