Saya ingin mencari pohon direktori secara rekursif dan mencantumkan jumlah file yang tersedia di setiap folder yang memiliki nama yang sesuai dengan string yang diberikan. Akibatnya, saya ingin mengembalikan hasil:
ls -l | wc -l
untuk setiap folder yang saya identifikasi melalui find
.
Kode
Kode di bawah ini dengan benar mencantumkan jumlah file di setiap folder yang namanya berisi Data Ajaib string.
find /path/to/cool/stuff
-maxdepth 4
-type d
-name '*Magic Data*'
-print0 | xargs
--verbose
-0 -I {} ls -l {}
Saya ingin memperluasnya dan menyalurkan hasil ls
ke wc -l
.
Coba
find /path/to/cool/stuff
-maxdepth 4
-type d
-name '*Magic Data*'
-print0 | xargs
--verbose
-0 -I {} ls -l {} | wc -l
Ini gagal dan mencetak:
ls -l /path/to/cool/stuff/some/folders/Magic Data
ls -l /path/to/cool/stuff/some/folders2/Magic Data
Keluaran yang diinginkan
/path/to/cool/stuff/some/folders/Magic Data 29
/path/to/cool/stuff/some/folders2/Magic Data 30
Output yang diinginkan akan berisi:
- Jalur lengkap ke folder yang dicari
- Keluaran dari
wc -l
, yang dalam hal ini mencerminkan jumlah file yang tidak disembunyikan
Jawaban yang Diterima:
Ada dua cara utama untuk menyelesaikan ini:
-
Ubah
find
perintah sehingga hanya memasuki direktori yang Anda minati dan kemudian mencetak satu karakter (mis.x
) untuk setiap file yang ditemukan di dalamnya. Kemudian hitung jumlah karakter yang dihasilkan denganwc -l
. Lebih aman untuk menampilkan karakter daripada nama path karena nama path di Unix berpotensi berisi baris baru. Solusi ini agak rumit karena melibatkan penggunaan-prune
untuk mengabaikan direktori yang tidak kami minati, atau sebagai alternatif! -path
. -
Temukan direktori seperti yang telah Anda lakukan sejauh ini, tetapi kemudian gunakan skrip in-line untuk menghitung file di dalamnya. Ini lebih sederhana, dan apa yang saya tunjukkan di bawah.
find /path/to/cool/stuff -maxdepth 4 -type d -name "*Magic Data*'
-exec bash -O dotglob -c '
dir=$1
set -- "$dir"/*
printf "%s %dn" "$dir" "$#"' bash {} ';'
Di sini, kami menemukan direktori seperti yang Anda lakukan, kemudian, untuk setiap direktori, kami menjalankan bash
singkat ini naskah:
dir=$1
set -- "$dir"/*
printf "%s %dn" "$dir" "$#"
Ini mengambil nama path direktori dari baris perintah (diberikan oleh find
), dan memperluas *
pola glob di dalamnya. Dengan mengatur dotglob
opsi shell pada baris perintah untuk skrip, kami dijamin juga menghitung file dan direktori tersembunyi (hapus -O dotglob
untuk tidak menghitung nama tersembunyi).
Kami melakukan perluasan semua nama sebagai argumen ke set
, yang akan mengatur parameter posisi ke entri yang diperluas. Jumlah parameter posisi tersedia sebagai $#
, yang juga merupakan jumlah file dalam direktori tertentu.
Terkait:
- Memahami opsi -exec dari `find`