Bagaimana cara mengubah izin untuk folder dan semua subfolder dan file dalam satu langkah di Linux? [Tutup]

1806

Saya ingin mengubah izin folder dan semua sub folder dan file dalam satu langkah (perintah) di Linux.

Saya sudah mencoba perintah di bawah ini tetapi hanya berfungsi untuk folder yang disebutkan:

chmod 775 /opt/lampp/htdocs

Apakah ada cara untuk mengatur chmod 755untuk /opt/lampp/htdocsdan semua isinya termasuk subfolder dan file?

Juga, di masa depan, jika saya membuat folder atau file baru di dalam htdocs, bagaimana izin itu secara otomatis diatur 755?

Saya juga melihat tautan ini:

http://stackoverflow.com/questions/3740187/how-to-set-default-chmod-in-linux-terminal

Adam
sumber
4
Apakah Anda berniat menulis chmod 75 /opt/lampp/htdocsatau haruskah itu benar-benar terjadi chmod 755 /opt/lampp/htdocs?
HelloGoodbye
233
Fakta bahwa pertanyaan dengan suara terbanyak ke-4 tentang Linux adalah "ditutup sebagai di luar topik" adalah lucu. Siapa selain seorang programmer yang peduli dengan chmod? Bagaimana ini di luar topik? Mengapa "izin", "folder", dan "cmod" bahkan diberi tag jika tidak sesuai topik?
Arthur Dent
8
@ArthurDent, karena pertanyaan ini (walaupun sangat valid dan membantu) lebih cocok untuk situs SE yang berfokus pada sistem, seperti SuperUser atau ServerFault. Ini tidak terkait dengan pemrograman.
penentu waktu
26
@timelmer Tentu, tapi saya bertanya lagi, mengapa ada tag "izin", "folder", dan "cmod"? Kapan cmod akan digunakan secara tegas untuk pemrograman?
Arthur Dent
9
Jika Anda ingin benar-benar pilih-pilih, Bash sebenarnya adalah bahasa scripting, tapi begitu juga php, yang sepertinya tidak keberatan.
timelmer

Jawaban:

2957

Jawaban lainnya benar, karena chmod -R 755akan mengatur izin ini untuk semua file dan subfolder di pohon. Tetapi mengapa Anda mau ? Mungkin masuk akal untuk direktori, tetapi mengapa mengatur bit eksekusi pada semua file?

Saya menduga apa yang benar-benar ingin Anda lakukan adalah mengatur direktori ke 755 dan meninggalkan file sendiri atau mengaturnya ke 644. Untuk ini, Anda dapat menggunakan findperintah. Sebagai contoh:

Untuk mengubah semua direktori menjadi 755 ( drwxr-xr-x):

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

Untuk mengubah semua file ke 644 ( -rw-r--r--):

find /opt/lampp/htdocs -type f -exec chmod 644 {} \;
WombleGoneBad
sumber
231
Adakah yang mau menjelaskan apa artinya {} \;di ujung telepon?
Nilzor
307
@Nilzor chmod 644 {} \;menentukan perintah yang akan dijalankan oleh finduntuk setiap file. {}diganti oleh path file, dan tanda titik koma menunjukkan akhir perintah (lolos, jika tidak maka akan ditafsirkan oleh shell bukan find).
tobbez
25
"tetapi mengapa mengatur bit eksekusi pada semua file" Mengapa tidak? Saya baru
mengenal
12
@FlavorScape Womble mengatur bit eksekusi secara eksklusif pada direktori yang dikembalikan oleh find. Izin eksekusi pada direktori memungkinkan kelas pengguna untuk membuat daftar isi direktori itu dan untuk memasukkannya. Secara umum Anda ingin r dan x pada direktori agar dapat diakses oleh Anda, meskipun mungkin ada kasus tepi aneh di mana Anda hanya akan menetapkan satu atau yang lain. Lihat panduan ini untuk info lebih lanjut: nixsrv.com/llthw/ex23
Alexandr Kurilin
25
Dengan pengecualian dari sleepynate, setiap respons mengabaikan untuk menjawab aspek pertanyaannya mengenai pengaturan izin untuk file / folder yang dibuat di masa depan .
JGarrido
781

Periksa opsi -R

chmod -R <permissionsettings> <dirname>

Di masa mendatang, Anda dapat menghemat banyak waktu dengan memeriksa halaman manual terlebih dahulu:

man <command name>

Jadi dalam hal ini:

man chmod
Steve Robillard
sumber
147
apa itu man?
Adam
36
itu adalah singkatan dari halaman manual dan merupakan perintah linux yang menunjukkan halaman manual untuk suatu perintah (kebanyakan perintah linux memiliki halaman manual). coba pria atau pria.
Steve Robillard
8
Ini tidak bekerja untuk saya di Terminal di Mac OS X. Di sana saya melakukan "chmod -R <permissionsettings> <dirname> *" dan berhasil.
Einar afslafsson
127
Saya pikir sekarang, sebenarnya lebih cepat memposting di sini atau menggunakan Google daripada menggunakan man. Khusus untuk sesuatu seperti di grepmana jika Anda baru manmengenalnya, akan sangat memakan waktu untuk menemukan contoh dalam dokumen, namun Google atau SO memberikan contoh dalam hitungan detik.
ely
17
Sebagai catatan, mereka yang tidak terbiasa dengan Linux mungkin tidak terbiasa dengan pria. Saya hanya tahu keberadaannya, tetapi mencoba mencari cara untuk menggunakannya akan membutuhkan petualangan google. Mungkin usaha yang bermanfaat, tetapi Anda harus menyadari bahwa saya menemukan posting SANGAT INI melalui google dan menjawab pertanyaan PERSIS yang saya tanyakan. Sumber daya, teman saya. Sumber daya tidak ternilai. Dan Anda mungkin berpikir ini tidak ada gunanya dan bahwa ia seharusnya memeriksa orang itu, tetapi ini telah membantu saya dan ratusan orang lainnya (bahkan ribuan). Jadi tolong pertimbangkan itu.
Soundfx4
391

Jika Anda ingin mengatur izin untuk semua file a+r, dan semua direktori a+x, dan melakukannya secara rekursif melalui pohon subdirektori lengkap, gunakan:

chmod -R a+rX *

The X(yaitu modal X, tidak kecil x!) Diabaikan untuk file (kecuali mereka yang dieksekusi untuk seseorang yang sudah) tapi digunakan untuk direktori.

Pete
sumber
27
Jawaban yang bagus Perhatikan bahwa * tidak akan cocok dengan file tersembunyi (nama dimulai dengan titik). Mungkin lebih masuk akal untuk digunakan. (untuk direktori saat ini).
Aaron Adams
21
Ini jawaban yang benar. Untuk kasus saya, saya ingin mengatur semua direktori menjadi 775 dan semua file menjadi 664 . @ Pete menjawab dengan luar biasa, membawa saya ke chmoddokumen, di mana saya tahu saya bisa menggunakannya chmod -R g+wX .. Bravo!
chadoh
8
Ini tidak akan menghapus xfile jika sudah memilikinya.
Benoit Duffez
5
Jika tidak sepenuhnya jelas, huruf besar X berarti "membuat semua direktori dapat dieksekusi" (tetapi bukan file).
Matt Browne
4
@BenoitDuffez jika tujuan Anda adalah juga menghapus bit yang dapat dieksekusi dari file, Anda dapat menggabungkan arahan, seperti "a-x + rX" untuk menghapus "x" dari segalanya dan kemudian mengatur "r" untuk semuanya dan "x" untuk direktori saja .
biarawati
144

Anda dapat menggunakan -Rdengan chmoduntuk traversal rekursif dari semua file dan subfolder.

Anda mungkin perlu sudo karena tergantung pada LAMP yang diinstal oleh pengguna saat ini atau yang lain:

sudo chmod -R 755 /opt/lampp/htdocs
ravi ranjan
sumber
17
Entah bagaimana, sudo chmod 755 -R /directorytidak berhasil tetapi sudo chmod -R 755 /directoryberhasil. Aneh. Omong-omong, saya menggunakan Mac os x.
lomse
8
Ini benar menurut pengalaman saya. Bendera harus muncul langsung setelah chmod, bukan di mana pun di string.
orionrush
1
Perintah tertulis di atas salah. Perintah rekursif yang benar adalah: sudo chmod -R 755 / opt / lampp / htdocs Catatan: -R harus sebelum 755
Sandip Patel - SM
Solusi ini berfungsi baik untuk Redhat. Terima kasih!
Lavande
Bekerja dengan baik pada RHEL dan sudo chmod 755 -Rbekerja
AnBisw
79

Perintah rekursif yang benar adalah:

sudo chmod -R 755 /opt/lampp/htdocs

-R: ubah setiap sub folder termasuk folder saat ini

Pramendra Gupta
sumber
1
hai Anda yakin tentang folder saat ini Anda satu meskipun jalan?
shareef
OSX MENGGUNAKAN: sudo chmod 777 log / -R MENDAPATKAN: chmod: -R: Tidak ada file atau direktori tersebut HARUS MENJADI: sudo chmod -R 777 log /
elad silver
76

Untuk mengatur ke semua subfolder (rekursif) gunakan -R

chmod 755 /folder -R

Dan gunakan umask untuk mengatur default ke folder baru / file cd / folder umask 755

Topera
sumber
24
JANGAN atur umask755! Anda tidak akan dapat membuat daftar, membaca atau menggunakan file atau direktori yang Anda buat!
nyenyak
14
Apakah maksud Anda umask 022?
Xkeeper
4
ini mengatur semua ke 755, termasuk file.!
Patrick Mutwiri
@syncynate Apa yang kamu bicarakan? 755 berarti pemilik dapat membaca, menulis, dan mengeksekusi, dan semua pengguna lain dapat membaca dan mengeksekusi, tetapi tidak menulis ke objek
svin83
2
@NicHartley @ svin83 umask adalah bit yang akan ditutup dari izin, jadi ini secara efektif kebalikan dari chmod. λ ~ → umask 022 λ ~ → umask -S u=rwx,g=rx,o=rx λ ~ → umask 755 λ ~ → umask -S u=,g=w,o=w
nyenyak
51

chmod 755 -R /opt/lampp/htdocsakan mengatur izin secara rekursif. Tidak ada cara untuk mengatur izin untuk file secara otomatis hanya dalam direktori ini yang dibuat setelah Anda mengatur izin, tetapi Anda dapat mengubah izin file default seluruh sistem Anda dengan dengan pengaturan umask 022.

tidur nyenyak
sumber
9
Jawaban sleepynate adalah HANYA yang benar. Poster itu mengajukan dua pertanyaan: 1) Bagaimana cara memperbaiki izin pada file dan folder, dan 2) bagaimana cara mengubah default (yang berarti file "masa depan"). Seperti yang dikatakan nate, yang pertama dengan "chmod", dan yang kedua dengan "umask". Saya juga menambahkan bahwa TIDAK ADA CARA untuk mengubah umask hanya pada 1 direktori ... umask adalah "semua atau tidak sama sekali" per pengguna. Namun tidak ada yang menghentikan Anda dari membuat pengguna baru, yang berbagi grup dengan Anda, sehingga Anda bisa 'sudo -u someuser [buat file] ". Itu sedikit berpikir di luar kotak, tapi ini solusi yang baik.
Scott Prive
Saya pikir Anda benar, tetapi tidak inheritbisa menjadi solusi untuk banyak kasus atau akankah ini bekerja dengan NTFS-3G secara eksklusif?
Sebastian Schlicht
tanpa memberikan izin kepada folder dapat dibuat di masa depan, orang mungkin tidak dapat menyalin folder, katakanlah myforlderdari tempat lain (seperti PC) ke direktori target ini (di server) karena ia akan mencoba membuat folder baru di direktori target dengan nama myfolder yang Anda tidak memiliki izin untuk melakukannya. Seperti yang saya miliki root, saya hanya menggunakan chown -R username:usergroup /directory.
Jason Goal
27

Anda mungkin ingin mempertimbangkan jawaban yang diberikan oleh nik di superuser ini dan menggunakan "satu chmod" untuk semua file / folder seperti ini:

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)
Iam Zesh
sumber
9
Peringatan, mudah untuk lari ke batas baris perintah.
Lothar
1
Saya memiliki kesalahan ini: -bash: / bin / chmod: Daftar argumen terlalu panjang
Oleg Abrazhaev
Akan lebih baik menggunakan -execopsi finduntuk mengatasi Argument list too longkesalahan.
Miravall
Terkait: Ubah semua izin folder dengan satu perintah di U & L.
G-Man Mengatakan 'Reinstate Monica'
20

Menggunakan:

sudo chmod 755 -R /whatever/your/directory/is

Namun, berhati-hatilah dengan itu. Ini benar-benar dapat melukai Anda jika Anda mengubah izin file / folder yang salah.

Nate Starner
sumber
20

Berikut cara lain untuk mengatur direktori ke 775 dan file ke 664.

find /opt/lampp/htdocs \
\( -type f -exec chmod ug+rw,o+r {} \; \) , \
\( -type d -exec chmod ug+rwxs,o+rx {} \; \)

Mungkin terlihat panjang, tapi cukup keren karena tiga alasan:

  1. Memindai melalui sistem file hanya sekali, bukan dua kali.
  2. Memberikan kontrol yang lebih baik atas bagaimana file ditangani vs. bagaimana direktori ditangani. Ini berguna ketika bekerja dengan mode khusus seperti bit sticky , yang mungkin ingin Anda terapkan ke direktori tetapi bukan file.
  3. Gunakan teknik langsung dari manhalaman (lihat di bawah).

Perhatikan bahwa saya belum mengkonfirmasi perbedaan kinerja (jika ada) antara solusi ini dan hanya menggunakan dua perintah find (seperti dalam solusi Peter Mortensen). Namun, melihat contoh serupa dalam manual ini menggembirakan.

Contoh dari man findhalaman:

find / \
\( -perm -4000 -fprintf /root/suid.txt %#m %u %p\n \) , \
\( -size +100M -fprintf /root/big.txt %-10s %p\n \)

Traverse the filesystem just once, listing setuid files and  direc‐
tories into /root/suid.txt and large files into /root/big.txt.

Bersulang

chrisfargen
sumber
Sekarang, bagaimana mengubahnya dalam skrip shell sehingga kita dapat menjalankan folder $ openmod?
StR
Teman-teman, silakan gunakan xargs. Ini menghemat ribuan proses pemanggilan.
seanahern
13

chmod -R 755 directory_nameberfungsi, tetapi bagaimana Anda akan menyimpan file baru ke 755 juga? Izin file menjadi izin default.

Sanchit Gupta
sumber
Saya melakukannya tetapi tidak dapat membuka terminal dari sana. Saya tidak bisa memperbaikinya.
Kavindu Gayantha
9

Untuk Mac OS X 10.7 (Lion), itu adalah:

chmod -R 755 /directory

Dan ya, seperti yang dikatakan semua orang lain, berhati-hatilah saat melakukan ini.

wmartin
sumber
9

Anda ingin memastikan bahwa file dan direktori yang sesuai adalah chmod-ed / izin untuk mereka yang sesuai. Untuk semua direktori yang Anda inginkan

find /opt/lampp/htdocs -type d -exec chmod 711 {} \;

Dan untuk semua gambar, JavaScript, CSS, HTML ... yah, Anda seharusnya tidak mengeksekusinya. Jadi gunakan

chmod 644 img/* js/* html/*

Tetapi untuk semua kode logika (misalnya kode PHP), Anda harus mengatur izin agar pengguna tidak dapat melihat kode itu:

chmod 600 file
NikolaiDante
sumber
6

Saya pikir Adam bertanya bagaimana cara mengubah nilai umask untuk semua proses yang ingin beroperasi pada /opt/lampp/htdocsdirektori.

Mask mode pembuatan file pengguna (umask) digunakan untuk menentukan izin file untuk file yang baru dibuat. Ini dapat digunakan untuk mengontrol izin file default untuk file baru.

jadi jika Anda akan menggunakan beberapa jenis program ftp untuk mengunggah file ke /opt/lampp/htdocsAnda perlu mengkonfigurasi server ftp Anda untuk menggunakan umask yang Anda inginkan.

Jika file / direktori dibuat misalnya dengan php, Anda perlu memodifikasi kode php

<?php
umask(0022);
// other code
?>

jika Anda akan membuat file / folder baru dari sesi bash Anda, Anda dapat menetapkan nilai umask di profil shell Anda ~ / .bashrc Atau Anda dapat mengatur umask di /etc/bashrcatau /etc/profilefile untuk semua pengguna. tambahkan yang berikut ke file: umask 022

Sample umask Values and File Creation Permissions
If umask value set to   User permission     Group permission     Others permission
000                         all              all                   all
007                         all              all                   none
027                         all          read / execute            none

Dan untuk mengubah izin untuk file yang sudah dibuat, Anda dapat menggunakan find. Semoga ini membantu.

Viktor
sumber
4

Ada dua jawaban untuk menemukan file dan menerapkannya chmod. Yang pertama adalah findfile dan berlaku chmodseperti yang ditemukan (seperti yang disarankan oleh @WombleGoneBad).

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

Solusi kedua adalah membuat daftar semua file dengan findperintah dan menyediakan daftar ini ke chmodperintah (seperti yang disarankan oleh @lamgesh).

chmod 755 $(find /path/to/base/dir -type d)

Kedua versi ini berfungsi dengan baik selama jumlah file yang dikembalikan oleh findperintah kecil. Solusi kedua terlihat bagus untuk mata dan lebih mudah dibaca daripada yang pertama. Jika ada banyak file, solusi kedua menghasilkan kesalahan:Argument list too long.

Jadi saran saya adalah

  1. Gunakan chmod -R 755 /opt/lampp/htdocsjika Anda ingin mengubah izin semua file dan direktori sekaligus.
  2. Gunakan find /opt/lampp/htdocs -type d -exec chmod 755 {} \;jika jumlah file yang Anda gunakan sangat besar. The -type xpilihan pencarian untuk jenis tertentu dari file saja, di mana d digunakan untuk menemukan direktori, f file dan l untuk link.
  3. Gunakan chmod 755 $(find /path/to/base/dir -type d)sebaliknya
  4. Lebih baik menggunakan yang pertama dalam situasi apa pun
Prabhu
sumber
2

Ini sangat sederhana.

Di Terminal buka file manager. Contoh: sudo nemo. Pergi /opt/kemudian klik Properti → Izin . dan kemudian lainnya . Akhirnya, ubah untuk membuat dan menghapus dan mengajukan akses untuk membaca dan menulis dan mengklik tombol berlaku ... Dan bekerja.

Debian.
sumber
apa itu sudo nemo?
Vikranth Inti