Chmod secara rekursif

249

Saya memiliki arsip, yang diarsipkan oleh orang lain, dan saya ingin secara otomatis, setelah saya unduh, untuk mengubah cabang sistem file dalam file yang diekstraksi untuk mendapatkan akses baca. (Saya tidak bisa mengubah cara arsip dibuat).

Saya telah melihat ke dalam utas ini: chmod: Cara menambahkan izin eksekusi secara rekursif hanya ke file yang sudah memiliki izin eksekusi seperti pada beberapa orang lain, tetapi tidak ada sukacita.

Direktori awalnya datang dengan beberapa tetapi semua bendera salah, mereka mungkin muncul sebagai:

drwx------
d---r-x---
drwxrwxr-x
dr--r-xr--

Itu hanya beberapa yang saya temukan sejauh ini, tetapi bisa jadi lebih.

findkesalahan ketika mencoba melihat ke direktori tanpa xizin, dan jadi tidak meneruskannya ke chmod. Apa yang telah saya lakukan sejauh ini, secara manual mengubah izin pada direktori induk, kemudian masuk ke direktori anak dan melakukan hal yang sama untuk mereka dan seterusnya. Tapi ini banyak kerja tangan. Apakah tidak ada cara untuk melakukan ini secara otomatis?

Yaitu bagaimana saya melakukannya sekarang:

melakukan:

$ chmod -R +x
$ chmod -R +r

sampai saya tidak mendapatkan kesalahan, lalu

$ find -type f -exec chmod -x {} +

Tetapi harus ada cara yang lebih baik.

Komunitas
sumber
3
-r tidak sama dengan -R
PJ Brunet
Catatan lain-lain, jika Anda ingin mengatakan bahwa buat semua izin grup cocok dengan izin pemilik (tampaknya lebih kecil kemungkinannya untuk meredam semuanya IMO) itu sangat mungkin untuk serverfault.com/a/284478/210994
ThorSummoner

Jawaban:

131

Anda perlu akses baca, selain untuk mengeksekusi akses, untuk membuat daftar direktori. Jika Anda hanya memiliki akses eksekusi, maka Anda dapat mengetahui nama entri dalam direktori, tetapi tidak ada informasi lain (bahkan bukan tipe, sehingga Anda tidak tahu entri mana yang merupakan subdirektori). Ini bekerja untuk saya:

find . -type d -exec chmod +rx {} \;
Fred Foo
sumber
2
Apa perbedaan antara '\;' dan '+' yang digunakan oleh OP di akhir perintah?
kon psych
1
@konpsych Rupanya +membangun command-line dengan cara yang berbeda. Aku sebenarnya tidak menyadarinya; \;adalah cara yang biasa, dengan satu perintah per file yang cocok dengan pencarian.
Fred Foo
Tidak berfungsi jika beberapa file memiliki spasi dalam namanya
Soonts
3
@Soonts Maka "{}"bukannya {}harus memperbaikinya.
user4642212
Saya menjalankan ini di bawah subsistem linux pada Windows 10 dan itu memiliki efek sebaliknya. Sebagian besar izin file telah dihapus.
Max Candocia
176

Anda dapat menggunakan chmod dengan X huruf mode (ibukota X) untuk mengatur flag yang dapat dieksekusi hanya untuk direktori.

Pada contoh di bawah ini, flag yang dapat dieksekusi dihapus dan kemudian diatur untuk semua direktori secara rekursif:

~$ mkdir foo
~$ mkdir foo/bar
~$ mkdir foo/baz
~$ touch foo/x
~$ touch foo/y

~$ chmod -R go-X foo 
~$ ls -l foo
total 8
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 bar
drwxrw-r-- 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

~$ chmod -R go+X foo 
~$ ls -l foo
total 8
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 bar
drwxrwxr-x 2 wq wq 4096 Nov 14 15:31 baz
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 x
-rw-rw-r-- 1 wq wq    0 Nov 14 15:31 y

Sedikit penjelasan:

  • chmod -x foo- hapus flag eXecutable untukfoo
  • chmod +x foo- mengatur flag eXecutable untukfoo
  • chmod go+x foo- sama seperti di atas, tetapi atur tanda hanya untuk Grup dan Pengguna lain , jangan sentuh izin Pengguna (pemilik)
  • chmod go+X foo - sama seperti di atas, tetapi hanya berlaku untuk direktori, jangan sentuh file
  • chmod -R go+X foo- sama seperti di atas, tetapi lakukan ini secara rekursif untuk semua subdirektori darifoo
Dmitry
sumber
80

Cobalah untuk mengubah semua pengajuan secara bersamaan:

chmod -R +xr
choroba
sumber
Itu akan menempatkan hak akses pada semua direktori juga.
Fred Foo
1
Iya. Ini hanya menggantikan langkah iterasi pertama. Anda masih harus menjalankannya find -type f -exec chmod -x {} +setelah itu.
choroba
50

Untuk membuat semua yang dapat ditulis oleh pemilik, baca / eksekusi oleh grup, dan dieksekusi dunia:

chmod -R 0755

Untuk membuat semuanya terbuka lebar:

chmod -R 0777
Tim Jensen
sumber
12
Tambahkan lokasi folder saat ini:chmod -R 0777 .
Danijel
18

Menambahkan izin yang dapat dieksekusi, secara rekursif , ke semua file (bukan folder) dalam folder saat ini dengan shekstensi:

find . -name '*.sh' -type f | xargs chmod +x

* Perhatikan pipa ( |)

AlikElzin-kilaka
sumber
2

Berikan 0777 ke semua file dan direktori mulai dari jalur saat ini:

chmod -R 0777 ./

Anthony Vinay
sumber