Bagaimana saya masuk ke daftar semua direktori yang tidak memiliki file dengan nama file yang diberikan di dalamnya? misal diberi pohon ini
/
/a
README
file001
file002
/b
README
file001
/c
file003
Saya ingin daftar direktori yang tidak memiliki nama file README
, dalam hal ini akan menjadi direktori /c
. Bagaimana saya melakukannya? Saya tidak bisa memikirkan sintaks menggunakan mis find
.
Jawaban:
Dengan asumsi
find
implementasi seperti GNUfind
yang menerima{}
tertanam dalam argumen ke-exec
:Contoh
Di sini direktori 1/1 hingga 5/5 memiliki README, direktori lainnya kosong.
Sekarang ketika kita menjalankan versi
find
perintah ini:Referensi
sumber
Anda dapat menggunakan
-exec
opsifind
untuk memeriksa file, dan kemudian mencetak semua hasil yang gagal diperiksa.sumber
Tidak perlu
find
. Cukup gunakan shell:Jika Anda membutuhkannya untuk rekursif, Anda dapat menggunakan (untuk
bash
,zsh
dapat melakukan ini secara default, gunakanset -o globstar
dalamksh93
):(perhatikan bahwa file-file dot dikecualikan secara default).
sumber
Dengan
zsh
dan kualifikasi glob (e
string ):atau
tambahkan
D
untuk memasukkan direktori tersembunyi:/
hanya memilih direktori dane_'[[ ! -f $REPLY/README ]]'_
selanjutnya hanya memilih nama direktori yang kode shellnya di antara tanda kutip kembalitrue
, yaitu untuk setiap nama direktori ($REPLY
) tempat glob*(/)
berkembang, ia menjalankan[[ ! -f $REPLY/README ]]
dan menyimpan nama direktori jika hasilnyatrue
.Bentuk kedua
^e_'.....'_
menggunakan kualifikasi glob yang sama, dinegasikan (tapi kali ini ekspresi kondisional tidak dinegasikan:)[[ -f $REPLY/README ]]
.Di atas hanya akan mengembalikan nama direktori di direktori saat ini.
Jika Anda ingin mencari secara rekursif (lagi, untuk memasukkan direktori tersembunyi tambahkan
D
kualifikasi):sumber
Portable, Anda bisa melakukan:
[ -f file ]
menguji apakah file tersebut ada dan dikonfirmasi sebagai file biasa (setelah resolusi symlink).Jika Anda ingin menguji bahwa itu hanya ada (sebagai entri dalam direktori itu), terlepas dari jenisnya, Anda perlu
[ -e file ] || [ -L file ]
:, meskipun perlu diketahui bahwa Anda memerlukan izin pencarian ke direktori untuk melakukan tes tersebut. Anda mungkin ingin menambahkan beberapa[ -x "$dir" ]
tes ke akun untuk kasus-kasus seperti:Atau untuk menghindari kondisi balapan, dengan
zsh
:Lihat juga Bagaimana saya tahu jika file biasa tidak ada di Bash? pada SO.
sumber