Bagaimana saya bisa menggunakan penghitung kata ( wc
) dan perpipaan untuk menghitung berapa banyak file atau direktori dalam /usr/bin
direktori?
scripting
find
wc
file-types
tunai
sumber
sumber
Jawaban:
Salah satu pendekatan akan digunakan
ls
untuk memberi kami daftar file, tetapi kami ingin daftar ini dijamin hanya menampilkan 1 file atau direktori per baris. The-1
switch akan melakukan ini untuk kita.Contoh
Buat data sampel di atas dalam direktori kosong.
Periksa:
Sekarang untuk menghitung, Anda dapat menggunakan
wc -l
untuk menghitung jumlah baris, yang sesuai dengan file atau direktori dalamls -1
output.(Namun perlu dicatat bahwa itu tidak termasuk file yang tersembunyi)
Menghitung file atau direktori, tidak bersama-sama
Untuk menghitung file atau direktori, Anda perlu sedikit mengubah taktik Anda. Dalam hal ini saya akan menggunakan
ls -l
karena ini menunjukkan apa itu direktori dan file apa.Contoh
Kemudian kita dapat menggunakan
grep
untuk menyaring direktori atau tidak-direktori seperti:Sekarang cukup gunakan
wc -l
lagi untuk menghitung di atas:Meskipun, Anda dapat menghindari
wc
sama sekali, dan menggunakangrep
's-c
pilihan:(Sekali lagi, file tersembunyi tidak termasuk. Perhatikan bahwa direktori dan reguler adalah dua jenis file. Ada lebih banyak lagi seperti pipa bernama, tautan simbolik, perangkat, soket ...).
Pengulangan
Jika Anda perlu menemukan file dan direktori secara rekursif di bawah
/usr/bin
maka Anda mungkin ingin mengubah taktik sepenuhnya dan menggunakan alat lain yang disebutfind
.Contoh
(meskipun di atas
/usr/bin
itu sendiri termasuk dalam hitungan)Teknik yang sama yang saya gunakan di atas dapat digunakan
ls
untuk melakukan sesuatu yang serupa tetapils
umumnya bukan alat yang baik untuk mem-parsing output.find
di sisi lain dibangun untuk ini, dan menawarkan sakelar untuk menemukan file atau direktori.(perhatikan bahwa saat ini,
find
sudah termasuk file tersembunyi (kecuali.
dan..
)).baris baru?
Saya tidak pernah tahu mengapa karakter baris baru adalah karakter hukum untuk digunakan saat membuat nama file atau nama direktori. Jadi metode yang dibahas di atas menggunakan
wc
danls
tidak akan menentangnya, jadi gunakan metode itu dengan mengingatnya.Contoh
Buat direktori & nama file dengan baris baru.
ls
menunjukkannya dengan benar:Tetapi
wc
menghitung direktori dan file yang berisi baris baru sebagai 2 item, bukan satu.Salah satu metode untuk mengatasi ini, jika menggunakan implementasi GNU
find
adalah dengan memanfaatkanfind
kemampuan untuk mencetak sesuatu yang lain di tempat setiap file yang ditemukannya dan kemudian menghitungnya.Contoh
Di sini kami menemukan semua yang ada di direktori saat ini (kecuali
..
), dan mencetak sebuah titik (.
) untuk masing-masing, dan kemudian menghitung titik menggunakanwc
kemampuan untuk menghitung byte alih-alih gariswc -c
,.Referensi
sumber
/usr/bin
akan diformat dengan baik (dan juga tidak akan berisi spasi, jadi secara teknis Anda bahkan bisa adilecho * | wc -w
), perlu dicatat bahwa semua ini akan merusak nama file yang mengandung baris baru.ls -l
atauls -1
akan merusak b / c kita menghitung baris, bukan kata-kata! Thefind
bisa pecah, tapi sekali lagi, kita menghitung garis bukan kata-kata.touch $'foo\nbar'
dalam direktori kosong diikuti oleh salah satu perintah Anda (katakanlahls -1 | wc -l
) akan melaporkan dua file daripada satu - karena satu file sejauh dua baris sejauhwc
yang bersangkutan. Kecuali jikals
mengganti baris baru dengan beberapa karakter lain (saya pikir tidak, tapi sekali lagi saya tidak dalam posisi untuk menguji sekarang).wc -c
ada masalah saat menghitung periode?Jika Anda ingin mendapatkan rincian jumlah setiap jenis file secara rekursif di bawah beberapa dir, dengan GNU
find
, Anda bisa melakukan:Di
/usr/bin
sistem saya, itu memberi:Pada
/dev
:Untuk symlink, jika Anda lebih suka menghitungnya sebagai jenis file yang mereka tuju alih-alih
symbolic links
, Anda dapat mengubahnya ke:Yang sekarang memberi saya
/usr/bin
:(symlink yang rusak adalah symlink ke file yang
find
tidak dapat menentukan jenisnya karena file tersebut tidak ada, atau berada di direktori yang Anda tidak memiliki akses ke atau ada loop dalam resolusi jalur file) Dalam kasus saya, 2 tempat symlink ke file yang sekarang hilang).Tak satu pun dari mereka dihitung
.
dan..
. Jika Anda ingin mereka dimasukkan (mengapa Anda mau?), Tidak ada cara lainfind
selain menganggap mereka ada di setiap direktori dan menghitungnya secara sistematis:Yang kemudian memberi saya
/usr/bin
:Jika Anda tidak memiliki akses ke GNU
find
, Anda dapat menulis ulang yang pertama sebagai:Sekarang, sebenarnya, kami tidak menghitung file tetapi entri direktori . Direktori seperti
/usr/bin
biasanya memiliki beberapa entri yang mengarah ke file yang sama. Misalnya, di sini, saya punya:Itu adalah 3 entri direktori (alias nama file alias tautan keras) ke file yang sama (satu dengan inode 672252. Untuk menghitung file alih-alih entri direktori dan dengan GNU
find
dan GNUuniq
(mengabaikan.
dan..
file yang toh merupakan tautan keras ke direktori lain):Pada saya
/usr/bin
, itu memberi:sumber
Anda belum mengatakan jika Anda ingin semua file di bawah / usr / bin secara rekursif atau hanya di bawah tingkat pertama. Juga, bagaimana Anda akan mendapatkan kata-kata yang Anda hitung? Cara yang biasa untuk mengetahuinya adalah dengan menjalankan find ke wc. Seperti ini: find / usr / bin | wc-l Find akan menampilkan semua yang ada di sana, direktori & file. Wc-l akan menghitung semua garis dalam output find. Apakah ini tugas kelas? Tidak apa-apa jika itu tapi saya bertanya-tanya mengapa Anda membutuhkan info ini sehingga saya bisa menyesuaikan respon dengan lebih hati-hati. Tolong beri tahu saya jika Anda membutuhkan lebih banyak. Costa
sumber
Di bash, tanpa alat eksternal.
Di bash, tanpa alat eksternal dan rekursi.
sumber
.
maupun..
entri. Anda mungkin ingin memisahkan file vs file biasa.