Chmod rekursif: rw untuk file, rwx untuk direktori

28

Saya ingin chmodbanyak file dan direktori. Seperti yang xditunjukkan daftar untuk direktori dan jalankan untuk file biasa saya ingin mendaftar rwuntuk file dan rwxuntuk direktori. Apakah mungkin hanya menggunakan chmodperintah?

Jika tidak, apa cara yang paling nyaman?

Melakukan suatu chmod -R 770tidak mungkin karena saya tidak ingin file biasa menjadi executable.

Dihapus
sumber
1
Apakah Anda benar-benar ingin izin menulis publik pada file dan direktori? Itu berarti Anda tidak peduli siapa yang mengacaukan salah satu file?
Jonathan Leffler
Benar. Saya mengubahnya di atas.
Dihapus

Jawaban:

19

Saya melakukan ini kadang-kadang menggunakan satu findperintah. Jelek tapi efektif.

find /p/a/t/h \( -type d -exec chmod 755 {} \; \) -o \( -type f -exec chmod 644 {} \; \)
Baumgart
sumber
Tidak "{}" perlu dikutip, kalau-kalau jalur menyimpan spasi? Suka find . -type d -exec chmod -vc 755 "{}" \;(termasuk -vcuntuk beberapa umpan balik). (Dan mungkin, hanya untuk memperjelas, tambahkan dua perintah mandiri untuk jawabannya juga?)
Arjan
Tidak, {} tidak perlu dikutip (Saya baru saja diuji untuk benar-benar yakin). Saat menemukan sisipan {} ke dalam perintah, perintah itu lolos dengan benar. Saya belum melihat cara kerja internal find, tetapi saya akan berasumsi bahwa itu menciptakan sebuah array argumen untuk diteruskan ke exec (), dan itu akan strcpy () nama file ke dalam array. Ketika chmod melihat argumennya, itu akan muncul dengan benar.
baumgart
37

Gunakan izin X, dari halaman manual:

Bit eksekusi / pencarian jika file tersebut adalah direktori atau salah satu bit eksekusi / pencarian diatur dalam mode asli (tidak dimodifikasi). Operasi dengan simbol perm "X" hanya bermakna dalam hubungannya dengan simbol op "+", dan diabaikan dalam semua kasus lainnya.

Jadi lakukan hal berikut:

chmod -R a-x [directory]
chmod -R a+rwX [directory]

Ini menghapus bit eksekusi dari semua file dan direktori diikuti dengan menambahkan hak baca dan tulis ke semuanya, dan jalankan privilege hanya untuk direktori. (Tidak ada file biasa yang memiliki bit eksekusi lagi dari langkah pertama.)

Ben S
sumber
1
ini tidak akan memaksa mode 666 pada file biasa. itu tidak menghapus bit yang dapat dieksekusi untuk file biasa jika mereka sudah mengaturnya.
Quack quixote
Jadi dalam hal ini Anda bisa melakukan chmod -R a-x [directory]diikuti chmod -R a+rwX [directory]?
jwaddell
@ jwaddel: Itu seharusnya berhasil. Anda menghapus semua mengeksekusi bit, tanpa file / jenis direktori, kemudian menambahkan mengeksekusi hanya direktori dan file biasa yang sudah memiliki bit eksekusi pada (yang sekarang ada.)
Ben S
Setelah saya lakukan a-x, direktori tidak dapat diakses. Bahkan, chmod gagal dengan izin ditolak dan tidak akan menghapus bit yang dapat dieksekusi dari file dalam direktori. Apakah ada cara untuk melakukan ini tanpa menjadi root?
avakar
14

Anda juga dapat menggunakan findbersama dengan xargs:

find . -type f -print0 | xargs -0 chmod 666
find . -type d -print0 | xargs -0 chmod 777

di mana -typemenspesifikasikan d irectory atau f ile.

John T
sumber
1
Bukankah xargs memiliki batasan panjang? Ini BANYAK file dan direktori.
Dihapus
2
Saya akan melakukan direktori terlebih dahulu, lalu file. Jika tidak, Anda akan berisiko kehilangan subtree karena kurangnya izin. Selain itu, Anda harus memeriksa apakah daftar ini diperiksa sebelum atau setelah chmod, jika tidak, sama seperti di atas. Dan ya, saya akan menahan diri untuk tidak menggunakan xargs.
Stefano Borini
1
xargscukup pintar untuk memecah baris perintah panjang ke beberapa eksekusi. Konsultasikan halaman manual xargs Anda dan pastikan untuk memeriksa xargs --show-limits.
Mike