Saya ingin mencari subdirektori dari direktori saat ini, yang (yaitu subdirektori) berisi 2 atau lebih file biasa.
Saya tidak tertarik pada direktori yang mengandung kurang dari 2 file, juga di direktori yang hanya berisi subdirektori.
Berikut adalah pendekatan yang sama sekali berbeda berdasarkan pada GNU find
dan uniq
. Ini jauh lebih cepat dan lebih ramah CPU daripada jawaban berdasarkan mengeksekusi perintah shell yang menghitung file untuk setiap direktori yang ditemukan.
find . -type f -printf '%h\n' | sort | uniq -d
The find
perintah mencetak direktori dari semua file dalam hirarki dan uniq
hanya menampilkan direktori yang muncul setidaknya dua kali.
find
. Dalam hal ini, karena GNUfind
akan memotong-motong nama direktori yang memiliki karakter yang tidak dapat dicetak di lokal saat ini (seperti "ä" di C locale). Lihat juga unix.stackexchange.com/questions/321697/…-printf '%h\0' | sort -z | uniq -zd | xargs -r0 ...
Ini akan menemukan semua nama di atau di bawah direktori saat ini dan kemudian menyaring semua nama yang bukan nama direktori.
Nama direktori yang tersisa akan diberikan ke skrip pendek ini:
Script ini akan menghitung jumlah file biasa (melewatkan tautan simbolik) di direktori yang diberikan sebagai argumen baris perintah pertama (dari
find
). Perintah terakhir dalam skrip adalah tes untuk melihat apakah hitungannya 2 atau lebih besar. Hasil tes ini adalah nilai balik (status keluar) dari skrip.Jika tes berhasil,
-print
akan menyebabkanfind
untuk mencetak jalur ke direktori.Untuk juga mempertimbangkan file tersembunyi (file yang namanya dimulai dengan titik), ubah
sh -c
skrip agar tidak mengatakanuntuk
Pengujian:
sumber
[ "" -ge 2 ]
ini adalah tes yang valid.dash
,bash --posix
dantest
semua menampilkan pesan kesalahan dan keluar dengan 2 (yaitu "Terjadi kesalahan")ksh
berjalan seperti massh
. Akan segera diubah. Terima kasih telah menyodok saya! :-)[ -f ... ]
tautan simbolik dereferensi. Anda harus menambahkan tes untuk menghilangkannya karena pertanyaan menentukan bahwa hanya file biasa yang harus dihitung.Dengan bantuan jawaban Gilles pada SU dan kebalikannya dan beberapa modifikasi, inilah yang Anda butuhkan.
Pohon direktori.
Hasil:
sumber
test
dandir2
direktori dalam pengujian saya (lihat jawaban saya).test/x1
dantest/x2
sebagai file juga ...$1
dan$2
akan menjadi direktori untuktest
, dan direktori akan dilewatkan.Lain
find
+wc
pendekatan:path/currdir
- path ke direktori Anda saat ini-maxdepth 1
- pertimbangkan hanya subfolder anak langsung! -empty
- abaikan subfolder kosong! -path "path/currdir"
- abaikan jalur direktori saat inicount=$(find "$1" -maxdepth 1 -type f | wc -l)
-count
ditugaskan dengan jumlah file untuk setiap subfolder yang ditemukan[ $count -ge 2 ] ... -print
- cetak nama / jalur subfolder yang berisi 2 atau lebih file biasasumber