Gunakan perintah chmod secara selektif

11

Saya ingin menetapkan 755 izin pada semua file dan sub-direktori di bawah direktori tertentu, tetapi saya ingin menjalankan chmod 755 hanya untuk komponen-komponen yang tidak memiliki izin 755.

find /main_directory/ -exec chmod 755 {} \;

Jika findperintah mengembalikan daftar panjang, ini akan memakan banyak waktu. Saya tahu bahwa saya dapat menggunakan perintah stat untuk memeriksa izin tingkat file Oktal dari masing-masing komponen dan kemudian menggunakan if-else untuk mengaktifkan izin file, tetapi apakah ada pendekatan garis tunggal yang menggunakan finddan xargsuntuk terlebih dahulu memeriksa izin apa yang dimiliki file / direktori tersebut? , dan kemudian gunakan chmoduntuk mengubahnya ke 755 jika diatur ke sesuatu yang lain.

Kumarjit Ghosh
sumber
6
Ini mungkin optimasi prematur, dan bahkan mungkin tidak membuat jika lebih cepat. Melakukan semua pemeriksaan itu dapat memperlambatnya. Pengujian untuk memastikan bahwa itu lebih cepat, hanya akan membuahkan hasil, jika Anda harus melakukan ini banyak.
ctrl-alt-delor
3
Anda mungkin tidak ingin memberikan izin eksekusi ke semua file. Ini akan menciptakan risiko keamanan. (Ini adalah salah satu vektor virus pada Microsoft Windows: semuanya dapat dieksekusi). Dalam mode simbolis, Anda dapat mengatakan u+rw,go+r,go-w,ugo+X- perhatikan ibukota.
ctrl-alt-delor
Saya setuju dengan @ ctrl-alt-delor tetapi akan menyarankan sesuatu yang lebih dekat dengan apa yang Anda minta, u = rwX, go = rX yang seharusnya mencapai hal yang sama.
penguin359

Jawaban:

21

Jika Anda ingin mengubah izin 755pada file dan direktori, tidak ada manfaat nyata untuk menggunakan find(dari sudut pandang kinerja setidaknya), dan Anda bisa melakukan

chmod -R 755 /main_directory

Jika Anda benar-benar ingin menggunakan finduntuk menghindari mengubah izin pada hal-hal yang sudah memiliki 755izin (untuk menghindari memperbarui cap waktu ctime mereka), maka Anda juga harus menguji izin saat ini pada setiap direktori dan file:

find /main_directory ! -perm 0755 -exec chmod 755 {} +

Mereka -exec ... {} +akan mengumpulkan nama path sebanyak mungkin yang lulus ! -perm 0755tes, dan mengeksekusi chmodsemuanya sekaligus.

Biasanya, seseorang ingin mengubah izin pada file dan direktori secara terpisah, sehingga tidak semua file dapat dieksekusi:

find /main_directory   -type d ! -perm 0755 -exec chmod 755 {} +
find /main_directory ! -type d ! -perm 0644 -exec chmod 644 {} +
Kusalananda
sumber
Bekerja seperti pesona, terima kasih. Salam, Kumarjit
Kumarjit Ghosh
1
Saya menduga menggunakan +bukannya ;membuat perbedaan besar di sini.
Kevin
Ini adalah cara cepat - hindari cek. Saya selanjutnya akan menggunakan find untuk membuat daftar hanya file yang Anda punya izin untuk mengubah ini akan menghindari kesalahan chmod pada file yang tidak dapat diubah. <pre> <code> # rwx, rw, wx, w hanya menemukan. -user $ (whoami) -perm / 002! -perm 0755 -ex chmod 0755 {} \; # pecahkan menjadi dua operasi find. -user $ (whoami) -perm / 002! -perm 0755> /tmp/chfiles.txt untuk file dalam $ (</ tmp / chfiles.txt) lakukan chmod --quiet 0755 "$ {file}" selesai </code> </pre>
Chris Reid
@ChrisReid Perhatikan bahwa mengulang daftar nama path seperti itu akan pecah jika ada pathname yang mengandung karakter spasi.
Kusalananda
Saya kira Anda perlu mengubah Pemisah Bidang Internal (IFS) menjadi '\ n' dalam skrip. Ini adalah pengaturan lingkungan, cara shell mengartikannya tergantung pada nilai pengaturan tersebut. Saya menguji skrip pada file dummy sebelum menggunakannya untuk menemukan bencana yang salah seperti mengganti nama file atau menimpa mereka. Saya suka cara printf shell untuk mengatur IFS. IFS = $ (printf "\ n") # sangat mudah dibaca
Chris Reid
1

Seperti yang finddidapat dari -exec ... +sintaksis, tidak ada gunanya menggunakan xargs, tetapi ketika Anda memintanya:

find /main_directory -not -perm 0755 | xargs chmod 755
Henrik mendukung komunitas
sumber
1
Perhatikan juga bahwa xargs tanpa -0(dalam kombinasi dengan -print0in; yang merupakan ekstensi GNU) dapat menjadi masalah keamanan yang cukup bijaksana jika penyerang potensial dapat membuat nama file yang menyertakan spasi putih atau karakter khusus lainnya di dalamnya. Jadi lebih baik berpegang -exec
teguh
Tidak perlu xargs(gunakan saja -exec), dan jika Anda menggunakannya Anda harus menggunakan -print0/ -0seperti kata Matija.
Kevin