Solusi standar yang direkomendasikan adalah langsung:
find . -type d -exec chmod 0755 "{}" \+
find . -type f -exec chmod 0644 "{}" \+
Ini akan menambahkan sebanyak mungkin nama file sebagai argumen ke satu perintah, hingga panjang baris perintah maksimum sistem. Jika garis melebihi panjang ini, perintah akan dipanggil berkali-kali.
Jika Anda ingin memanggil perintah satu kali per file, Anda dapat melakukannya:
find . -type d -exec chmod 0755 "{}" \;
find . -type f -exec chmod 0644 "{}" \;
chmod -R a=,u+rwX,go+rX $DIR tampaknya berfungsi dengan baik, dan kemungkinan besar menjadi yang tercepat, bagaimanapun Anda melihatnya.
(Saya memeriksa dengan strace , dan itu hanya membuat satu fchmodat() syscall per file/direktori -- untuk file dengan 644 dan untuk direktori dengan 755).
Caranya adalah X izin, didokumentasikan dalam man chmod , yang bertindak seperti x hanya untuk direktori -- perbedaan yang Anda inginkan.
Apa yang tidak terdokumentasi adalah dugaan saya bahwa mereka akan diterapkan dalam urutan yang sama seperti yang ditentukan, dan tidak hanya dalam urutan acak, tetapi pengujian berulang dengan beberapa varian telah meyakinkan saya bahwa mereka benar-benar berjalan sesuai urutan yang diberikan, jadi saya cukup yakin ini akan selalu berfungsi seperti ini.
Saya harus menyebutkan ini di Linux, meskipun pembacaan sepintas halaman manual BSD untuk chmod menyarankan bahwa itu harus bekerja di sana juga.
Saya membandingkan jawaban sitaram, komentar Peter Cordes, jawaban Fanatique, dan jawaban harrymc, tetapi jawaban ini memiliki cara tercepat .
Rata-rata:
- Jawaban Delta* – 7,480 detik
- jawaban sitaram – 12,962 detik (73,275% lebih lambat dari yang terbaik)
- Komentar Peter Cordes – 14,414 detik (92,685% lebih lambat dari yang terbaik)
- Jawaban Fanatique – 14,570 detik (94,772% lebih lambat dari yang terbaik)
- jawaban terbaru harrymc – 14,791 detik (97,730% lebih lambat dari yang terbaik)
- jawaban asli harrymc – 1061,926 detik (14096,113% lebih lambat dari yang terbaik)
Ringkasan statistik lengkap:
Author N min q1 median q3 max mean stddev
------------------ -- ------- ------- ------- ------- ------- ------- --------
Deltik 10 7.121 7.3585 7.4615 7.558 8.005 7.4804 0.248965
sitaram 10 12.651 12.803 12.943 13.0685 13.586 12.9617 0.276589
Peter Cordes 10 14.096 14.2875 14.375 14.4495 15.101 14.4136 0.269732
Fanatique 10 14.219 14.512 14.5615 14.6525 14.892 14.5697 0.211788
harrymc (updated) 10 14.38 14.677 14.8595 14.9025 15.119 14.791 0.21817
harrymc (original) 1 1061.93 1061.93 1061.93 1061.93 1061.93 1061.93 N/A
Perintah Deltik, dalam format tolok ukur:
find "$(pwd)" -type d | xargs -P4 chmod 755 & \ find "$(pwd)" -type f | xargs -P4 chmod 644 & wait
perintah sitaram, dalam format tolok ukur:
chmod -R a=,u+rwX,go+rX "$(pwd)"
Perintah Peter Cordes, dalam format tolok ukur:
find "$(pwd)" \( -type d -exec chmod 755 {} + \) \
-o \( -type f -exec chmod 644 {} + \)
Perintah Fanatique, dalam format tolok ukur:
find "$(pwd)" -type d -print0 | xargs -0 chmod 755 ; \ find "$(pwd)" -type f -print0 | xargs -0 chmod 644
perintah terbaru harrymc, dalam format tolok ukur:
find "$(pwd)" -type d -exec chmod 755 {} + ; \
find "$(pwd)" -type f -exec chmod 644 {} +
perintah asli harrymc, dalam format tolok ukur:
find "$(pwd)" -type d -exec chmod 755 {} \; ; \
find "$(pwd)" -type f -exec chmod 644 {} \;
Perintah saya adalah yang tercepat berkat empat chmod paralel proses per jenis file. Ini memungkinkan banyak inti CPU untuk menjalankan chmod , yang memindahkan kemacetan menuju utas I/O kernel atau disk.
perintah sitaram adalah runner-up karena semuanya dilakukan dalam chmod memerintah. Ini secara substansial mengurangi biaya overhead dibandingkan dengan jawaban lain karena:
- File hanya perlu dipindai satu kali (mirip dengan melakukan satu
findbukannya dua), dan - Tidak ada proses anak yang perlu dibuat.
Namun, perintah ini paling tidak fleksibel karena bergantung pada trik yang melibatkan perbedaan arti bit yang dapat dieksekusi antara file dan direktori biasa.
Komentar Peter Cordes, yang menggunakan satu find perintah, mencegah pencarian ganda entri direktori. Semakin banyak file, semakin besar peningkatan ini. Itu masih memiliki overhead untuk membuat anak chmod proses, itulah mengapa ini sedikit lebih lambat daripada chmod -satu-satunya solusi.
Antara perintah Fanatique dan perintah harrymc yang diperbarui, find disalurkan ke xargs (find | xargs ) lebih cepat karena aliran hasil diproses secara asinkron. Alih-alih find menjeda perilaku pencariannya untuk -exec , hasil yang ditemukan dikirim ke xargs untuk pemrosesan bersamaan.
(Pembatas byte null (find -print0 | xargs -0 ) tampaknya tidak memengaruhi waktu berjalan.)
perintah asli harrymc terlalu lambat karena overhead chmod baru perintah untuk setiap file dan folder, masing-masing dijalankan secara berurutan.
Dalam penyiapan pengujian, ada 1000002 file biasa yang terdapat dalam 1001 direktori:
example@unixlinux.online:~# echo {0..999} | xargs mkdir -p
example@unixlinux.online:~# find -type d -exec bash -c "cd {}; echo {0..999} | xargs touch" \;
example@unixlinux.online:~# find | wc -l
1001003
example@unixlinux.online:~# find -type d | wc -l
1001
example@unixlinux.online:~# find -type f | wc -l
1000002
Saya mengatur semua file dan folder untuk memiliki 777 izin, seperti kondisi awal pertanyaan.
Kemudian, saya membandingkan perintah sepuluh kali, setiap kali mengembalikan izin ke 777 dengan chmod -R 0777 "$(pwd)" sebelum menjalankan tes.
Dengan OUTPUT mewakili file yang berisi output dari setiap perintah benchmark, saya menghitung waktu rata-rata menggunakan:
bc <<< "scale=3; ($(grep real OUTPUT | grep -Po '(?<=m).*(?=s)' | xargs | sed 's/ /+/g'))/10"
Hasil tolok ukur jawaban Deltik
example@unixlinux.online:~# for i in {0..9} ; do chmod -R 0777 "$(pwd)" ; time { find "$(pwd)" -type d | xargs -P4 chmod 755 & find "$(pwd)" -type f | xargs -P4 chmod 644 & wait ; } ; done
[1] 9791
[2] 9793
[1]- Done find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+ Done find "$(pwd)" -type f | xargs -P4 chmod 644
real 0m7.634s
user 0m2.536s
sys 0m23.384s
[1] 9906
[2] 9908
[1]- Done find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+ Done find "$(pwd)" -type f | xargs -P4 chmod 644
real 0m7.443s
user 0m2.636s
sys 0m23.106s
[1] 10021
[2] 10023
[1]- Done find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+ Done find "$(pwd)" -type f | xargs -P4 chmod 644
real 0m8.005s
user 0m2.672s
sys 0m24.557s
[1] 10136
[2] 10138
[1]- Done find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+ Done find "$(pwd)" -type f | xargs -P4 chmod 644
real 0m7.480s
user 0m2.541s
sys 0m23.699s
[1] 10251
[2] 10253
[1]- Done find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+ Done find "$(pwd)" -type f | xargs -P4 chmod 644
real 0m7.397s
user 0m2.558s
sys 0m23.583s
[1] 10366
[2] 10368
[1]- Done find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+ Done find "$(pwd)" -type f | xargs -P4 chmod 644
real 0m7.482s
user 0m2.601s
sys 0m23.728s
[1] 10481
[2] 10483
[1]- Done find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+ Done find "$(pwd)" -type f | xargs -P4 chmod 644
real 0m7.679s
user 0m2.749s
sys 0m23.395s
[1] 10596
[2] 10598
[1]- Done find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+ Done find "$(pwd)" -type f | xargs -P4 chmod 644
real 0m7.243s
user 0m2.583s
sys 0m23.400s
[1] 10729
[2] 10731
[1]- Done find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+ Done find "$(pwd)" -type f | xargs -P4 chmod 644
real 0m7.320s
user 0m2.640s
sys 0m23.403s
[1] 10844
[2] 10847
[1]- Done find "$(pwd)" -type d | xargs -P4 chmod 755
[2]+ Done find "$(pwd)" -type f | xargs -P4 chmod 644
real 0m7.121s
user 0m2.490s
sys 0m22.943s
Waktu rata-rata:7,480 detik
Hasil tolok ukur jawaban sitaram
example@unixlinux.online:~# for i in {0..9} ; do chmod -R 0777 "$(pwd)" ; time chmod -R a=,u+rwX,go+rX "$(pwd)" ; done
real 0m12.860s
user 0m0.940s
sys 0m11.725s
real 0m13.059s
user 0m0.896s
sys 0m11.937s
real 0m12.819s
user 0m0.945s
sys 0m11.706s
real 0m13.078s
user 0m0.855s
sys 0m12.000s
real 0m12.653s
user 0m0.856s
sys 0m11.667s
real 0m12.787s
user 0m0.820s
sys 0m11.834s
real 0m12.651s
user 0m0.916s
sys 0m11.578s
real 0m13.098s
user 0m0.939s
sys 0m12.004s
real 0m13.586s
user 0m1.024s
sys 0m12.372s
real 0m13.026s
user 0m0.976s
sys 0m11.910s
Waktu rata-rata:12,962 detik
Hasil tolok ukur komentar Peter Cordes
example@unixlinux.online:~# for i in {0..9} ; do chmod -R 0777 "$(pwd)" ; time find "$(pwd)" \( -type d -exec chmod 755 {} + \) -o \( -type f -exec chmod 644 {} + \) ; done
real 0m14.096s
user 0m1.455s
sys 0m12.456s
real 0m14.492s
user 0m1.398s
sys 0m12.897s
real 0m14.309s
user 0m1.518s
sys 0m12.576s
real 0m14.451s
user 0m1.477s
sys 0m12.776s
real 0m15.101s
user 0m1.554s
sys 0m13.378s
real 0m14.223s
user 0m1.470s
sys 0m12.560s
real 0m14.266s
user 0m1.459s
sys 0m12.609s
real 0m14.357s
user 0m1.415s
sys 0m12.733s
real 0m14.393s
user 0m1.404s
sys 0m12.830s
real 0m14.448s
user 0m1.492s
sys 0m12.717s
Waktu rata-rata:14,414 detik
Hasil tolok ukur jawaban Fanatique
example@unixlinux.online:~# for i in {0..9} ; do chmod -R 0777 "$(pwd)" ; time { find "$(pwd)" -type d -print0 | xargs -0 chmod 755 ; find "$(pwd)" -type f -print0 | xargs -0 chmod 644 ; } ; done
real 0m14.561s
user 0m1.991s
sys 0m13.343s
real 0m14.521s
user 0m1.958s
sys 0m13.352s
real 0m14.696s
user 0m1.967s
sys 0m13.463s
real 0m14.562s
user 0m1.875s
sys 0m13.400s
real 0m14.609s
user 0m1.841s
sys 0m13.533s
real 0m14.892s
user 0m2.050s
sys 0m13.630s
real 0m14.291s
user 0m1.885s
sys 0m13.182s
real 0m14.843s
user 0m2.066s
sys 0m13.578s
real 0m14.219s
user 0m1.837s
sys 0m13.145s
real 0m14.503s
user 0m1.803s
sys 0m13.419s
Waktu rata-rata:14,570 detik
Hasil tolok ukur jawaban harrymc yang diperbarui
example@unixlinux.online:~# for i in {0..9} ; do chmod -R 0777 "$(pwd)" ; time { find "$(pwd)" -type d -exec chmod 755 {} + ; find "$(pwd)" -type f -exec chmod 644 {} + ; } ; done
real 0m14.975s
user 0m1.728s
sys 0m13.050s
real 0m14.710s
user 0m1.586s
sys 0m12.979s
real 0m14.644s
user 0m1.641s
sys 0m12.872s
real 0m14.927s
user 0m1.706s
sys 0m13.036s
real 0m14.867s
user 0m1.597s
sys 0m13.086s
real 0m15.119s
user 0m1.666s
sys 0m13.259s
real 0m14.878s
user 0m1.590s
sys 0m13.098s
real 0m14.852s
user 0m1.681s
sys 0m13.045s
real 0m14.380s
user 0m1.603s
sys 0m12.663s
real 0m14.558s
user 0m1.514s
sys 0m12.899s
Waktu rata-rata:14,791 detik
Hasil tolok ukur jawaban asli harrymc
Karena lambatnya perintah ini, saya hanya menjalankan tolok ukur satu kali.
example@unixlinux.online:~# for i in {0..0} ; do chmod -R 0777 "$(pwd)" ; time { find "$(pwd)" -type d -exec chmod 755 {} \; ; find "$(pwd)" -type f -exec chmod 644 {} \; ; } ; done
real 17m41.926s
user 12m26.896s
sys 4m58.332s
Waktu yang dibutuhkan:1061,926 detik