mengubah izin file secara rekursif tetapi tidak pada direktori?

13

Saya sedang melakukan perubahan izin beberapa file secara rekursif massal yang telah saya migrasi ke sistem unix. Saya mengubahnya menjadi ug + rw, tetapi kemudian saya menemukan bahwa saya tidak dapat melintasi subdirektori. Saya melihat halaman manual chmoddan tidak melihat penjelasan untuk mengecualikan direktori, jadi saya mencari di Google sedikit dan menemukan bahwa orang-orang digunakan finduntuk mengubah izin pada direktori untuk 'mengeksekusi' secara rekursif untuk pengguna dan grup. Saya melakukan itu dan kemudian saya bisa melihat mereka.

Tetapi bagi saya sepertinya saya bisa dapat melakukan penemuan ini chmod- untuk secara rekursif mengubah file menjadi baca / tulis tetapi tidak membuat direktori tidak dapat dilacak. Sudahkah saya melakukan ini dengan cara yang 'benar' atau apakah ada cara yang lebih sederhana untuk melakukannya?

pengguna394
sumber

Jawaban:

12

Solusi yang lebih baik seharusnya

chmod -R ug=rwX,o=rX /path

dimana the capital Xartinya: set eksekusi bit if

file tersebut adalah direktori atau sudah memiliki izin eksekusi untuk beberapa pengguna

(dikutip dari chmodhalaman manual).

Atau juga, jika ingin digunakan find

find /path \( -type f -exec chmod ug=rw,o=r   {} + \) -o \
           \( -type d -exec chmod ug=rwx,o=rx {} + \)
enzotib
sumber
Saya menggunakan versi terbuka lebar untuk semua orang dari perintah ini untuk hard drive USB saya: chmod -v -R ugo = rwX / path Terima kasih!
The Dude
Jelas tidak ada cara tanpa menggunakan finduntuk mengatur semua hak akses file ke 600 dan semua hak akses direktori ke 700. (Saya tiba di sini melalui googling saya pada subjek.) Jika itu dapat dilakukan dengan satu chmod -Rperintah, jangan ragu untuk memperbaiki saya.
Wildcard
@ Kartu Memori: tidak persis, perintahnya chmod -R u=rwX,go= /pathmelakukan hampir apa yang Anda inginkan: ia mengatur semua dir ke 700 dan semua file menjadi 600 atau 700, tergantung pada apakah bit eksekusi sudah ditetapkan atau tidak, dan saya pikir ini adalah hal yang benar untuk dilakukan .
enzotib
1
@enzotib, ya — hampir, tetapi tidak cukup. Dalam kasus saya, saya ingin menonaktifkan bit eksekusi untuk semua file (tetapi tentu saja tidak direktori) terlepas dari apakah itu skrip atau binari atau apa pun. Jadi findperintah yang Anda tulis sangat membantu sebagai templat. :)
Wildcard
@ Kartu Memori bagaimana dengan menghapus bit eksekusi terlebih dahulu, secara rekursif, lalu menambahkannya kembali hanya ke direktori menggunakan perintah di atas?
Michael
3

Menggunakan find adalah cara yang 'benar', dan satu-satunya cara yang terprogram, meskipun ada variasi:

find . -type f -exec chmod ug+rw {} +  # "+" may not be on all systems

atau

find . -type f -print0 | xargs -r0 chmod ug+rw  # similar to the -exec + functionality

atau yang paling lambat:

find . -type f -exec chmod ug+rw {} \;  # in case xargs is not installed

Masing-masing memilih file (bukan direktori, bukan symlink) dan menerapkan chmodperintah di atasnya. Dua yang pertama mengurangi jumlah panggilan chmoddengan menambahkan file ke akhir baris perintah internal setiap kali sampai maksimum tercapai (sering 10), kemudian memanggil perintah dan mulai membangun kembali perintah baru. Pernyataan terakhir memunculkan proses baru untuk setiap file, sehingga kurang efisien.

Arcege
sumber