Pertanyaan Bagaimana secara rekursif chmod semua direktori kecuali file?


Bagaimana chmod 755 semua direktori tetapi tidak ada file (secara rekursif)?

Terbalik, bagaimana chmod hanya file (secara rekursif) tetapi tidak ada direktori?


518
2018-01-06 01:56


asal


Terkait: Ubah semua file dan folder izin dari direktori ke 644/755di SO - kenorb


Jawaban:


Untuk memberi secara rekursif direktori baca & eksekusi hak istimewa:

find /path/to/base/dir -type d -exec chmod 755 {} +

Untuk memberi secara rekursif file membaca hak istimewa:

find /path/to/base/dir -type f -exec chmod 644 {} +

Atau, jika ada banyak objek untuk diproses:

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

Atau, untuk mengurangi chmod hal ikan bertelur:

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644

722
2018-01-06 01:58



Dua contoh pertama gagal untuk direktori dengan terlalu banyak file: -bash: /bin/chmod: Argument list too long. Perintah terakhir bekerja dengan banyak file, tetapi ketika menggunakan sudo orang harus berhati-hati untuk meletakkannya sebelum xargs daripada chmod: find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755 - Agargara
Juga untuk dicatat, perintah-perintah ini inklusif dir dasar. Jadi dalam contoh di atas, dir juga akan diatur ke 755. - CenterOrbit
chmod ... $(find /path/to/base/dir -type ...) gagal untuk nama file dengan spasi di nama. - Dan Dascalescu
Saya pikir yang paling benar (tetapi tidak tercepat) versi sehubungan dengan spasi dan simbol dalam nama file dan jumlah file find /path/to/base/dir -type d -exec chmod 755 {} \; (find /path/to/base/dir -type f -exec chmod 644 {} \;). - Peter K


Alasan umum untuk hal semacam ini adalah untuk mengatur direktori ke 755 tetapi file ke 644. Dalam hal ini ada cara yang sedikit lebih cepat daripada nik find contoh:

chmod -R u+rwX,go+rX,go-w /path

Berarti:

  • -R = secara rekursif;
  • u+rwX = Pengguna dapat membaca, menulis, dan mengeksekusi;
  • go+rX = grup dan orang lain dapat membaca dan mengeksekusi;
  • go-w = grup dan yang lain tidak bisa menulis

Yang penting untuk dicatat di sini adalah huruf besar itu X bertindak berbeda untuk huruf kecil x. Secara manual kita dapat membaca:

Bit eksekusi / pencarian jika file adalah direktori atau salah satu dari bit eksekusi / pencarian diatur dalam mode asli (tidak dimodifikasi).

Dengan kata lain, chmod u + X pada file tidak mengatur bit eksekusi; dan g + X hanya akan mengaturnya jika sudah diatur untuk pengguna.


261
2018-01-06 03:22



-R = secara rekursif; u + rwX = Pengguna dapat membaca, menulis, dan mengeksekusi; go + rX = grup dan lainnya dapat membaca dan mengeksekusi; go-w = grup dan yang lain tidak bisa menulis - släcker
Pola ini tidak akan memperbaiki situasi ketika seseorang telah selesai chmod -R 777 sejak itu +X pilihan tidak akan me-reset bit eksekusi yang ada pada file. Menggunakan -x akan mereset direktori, dan mencegah turun ke dalamnya. - Andrew Vit
@ ring0: Saya tidak bermaksud menjawab pertanyaan secara harfiah karena posed - nik telah melakukannya dengan sangat baik. Saya menunjukkan solusi yang lebih murah untuk kasus yang paling umum. Dan ya, Anda mendapatkan izin yang berbeda untuk file dan direktori dengan X, seperti yang dijelaskan di komentar. - bobince
go+rX,go-w -> go=rX bukan? - Pierre de LESPINAY
Anda juga bisa menggunakan chmod u-x,u+X dalam kombinasi, dll., untuk menghapus mengeksekusi bit untuk file, tetapi menambahkannya untuk direktori. - w0rp


Jika Anda ingin memastikan file disetel ke 644 dan ada file di jalur yang memiliki tanda eksekusi, Anda harus menghapus bendera eksekusi terlebih dahulu. + X tidak menghapus flag eksekusi dari file yang sudah memilikinya.

Contoh:

chmod -R ugo-x,u+rwX,go+rX,go-w path

Pembaruan: ini tampaknya gagal karena perubahan pertama (ugo-x) membuat direktori tidak dapat dieksekusi, sehingga semua file di bawahnya tidak berubah.


12
2018-01-22 16:14



Ini bekerja untuk saya, dan saya tidak mengerti mengapa tidak. (Tentu, jika Anda memang melakukannya chmod -R ugo-x path, itu mungkin masalah. Tetapi perintah lengkap akan melakukan chmod u+rwX pada setiap direktori sebelum mencoba untuk turun ke dalamnya.) Namun, saya percaya itu chmod R u=rw,go=r,a+X path sudah cukup - dan itu lebih pendek. - Scott
Saya menemukan ini bekerja dengan benar; tidak ada masalah dengan memasukkan direktori - Someone Somewhere


Saya memutuskan untuk menulis skrip kecil untuk ini sendiri.

Skrip chmod rekursif untuk dirs dan / atau file - Gist

Ini pada dasarnya melakukan chmod rekursif tetapi juga menyediakan sedikit fleksibilitas untuk opsi baris perintah (set direktori dan / atau izin file, atau mengecualikan keduanya secara otomatis mengatur ulang semuanya ke 755-644). Ini juga memeriksa beberapa skenario kesalahan.

Saya juga menulis tentang itu di blog saya.


4
2017-09-18 14:00





Untuk memberi secara rekursif direktori baca & eksekusi hak istimewa:

find /path/to/base/dir -type d -exec chmod 755 {} \;

Untuk memberi secara rekursif file membaca hak istimewa:

find /path/to/base/dir -type f -exec chmod 644 {} \;

Lebih baik terlambat daripada tidak pernah membiarkan saya meningkatkan jawaban nik di sisi kebenaran. Solusi saya lebih lambat, tetapi bekerja dengan sejumlah file, dengan simbol apa pun dalam nama file, dan Anda dapat menjalankannya dengan sudo secara normal (tapi hati-hati bahwa ia mungkin menemukan file yang berbeda dengan sudo).


3
2018-02-21 11:58





Coba skrip python ini; tidak memerlukan proses pemijahan dan hanya memiliki dua syscalls per file. Terlepas dari implementasi di C, itu mungkin akan menjadi cara tercepat untuk melakukannya (saya membutuhkannya untuk memperbaiki filesystem dari 15 juta file yang semuanya diatur ke 777)

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

Dalam kasus saya, try / catch diperlukan di sekitar chmod terakhir, karena chmodding beberapa file khusus gagal.


0
2018-03-26 04:37





Anda juga bisa menggunakan tree:

tree -faid /your_directory | xargs -L1 -I{} sudo chmod +x {}

-1
2018-02-16 09:34





Anda bisa menggunakan skrip bash berikut sebagai contoh. Pastikan untuk memberikan izin yang dapat dieksekusi (755). Cukup gunakan ./autochmod.sh untuk direktori saat ini, atau ./autochmod.sh <dir> untuk menentukan yang berbeda.

#!/bin/bash

if [ -e $1 ]; then
    if [ -d $1 ];then
        dir=$1
    else
        echo "No such directory: $1"
        exit
    fi
else
    dir="./"
fi

for f in $(ls -l $dir | awk '{print $8}'); do
    if [ -d $f ];then
        chmod 755 $f
    else
        chmod 644 $f
    fi
done

-2
2018-01-29 11:56



Wow! Begitu banyak masalah! (1) Jika $1 bukan null, tetapi bukan nama direktori (misalnya, adalah salah ketik), lalu dir diatur ke . tanpa pesan. (2) $1 seharusnya "$1" dan $dir seharusnya "$dir". (3) Anda tidak perlu mengatakannya "./"; "." tidak masalah (dan, tegasnya, Anda tidak perlu tanda kutip di sini). (4) Ini bukan solusi rekursif. (5) Di sistem saya, ls -l … | awk '{ print $8 }' mendapatkan waktu modifikasi file. Anda butuh { print $9 } mendapatkan kata pertama dari nama file. Dan bahkan kemudian, (6) ini tidak menangani nama file dengan spasi. ... - Scott
... Dan, last but not least (∞) jika skrip ini ada di direktori saat ini, itu akan chmod  diri hingga 644, sehingga menjadikannya tidak dapat dieksekusi! - Scott