Cara chmod 755 semua direktori tapi tidak ada file (secara rekursif) ?
Berbanding terbalik, cara chmod hanya file (secara rekursif) tapi tidak ada direktori ?
Untuk rekursif memberikan direktori baca&melaksanakan hak:
find /path/to/base/dir -type d -exec chmod 755 {} +
Untuk rekursif memberikan file baca keistimewaan:
find /path/to/base/dir -type f -exec chmod 644 {} +
Atau, jika ada banyak objek untuk proses:
chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)
Atau, untuk mengurangi chmod
pemijahan:
find /path/to/base/dir -type d -print0 | xargs -0 chmod 755
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644
Alasan umum untuk hal semacam ini adalah untuk mengatur direktori untuk 755 tapi file 644. Dalam hal ini ada's sedikit cara yang lebih cepat dari nik's menemukan
contoh:
chmod -R u+rwX,go+rX,go-w /path
Artinya:
-R
= rekursif;u+rwX
= Pengguna bisa membaca, menulis dan mengeksekusi;go+rX
= kelompok dan lain-lain dapat membaca dan mengeksekusi;go-w
= kelompok dan lain-lain dapat't menulisHal penting untuk dicatat di sini adalah bahwa huruf X
bertindak berbeda dengan huruf kecil x
. Secara manual kita bisa membaca:
melaksanakan/search bit jika file adalah direktori atau mengeksekusi/search bit set asli (dimodifikasi) mode.
Dengan kata lain, chmod u+X file won't mengatur bit eksekusi; dan g+X hanya akan set jika itu's sudah ditetapkan untuk pengguna.
Jika anda ingin memastikan file yang ditetapkan untuk 644 dan ada file di jalan yang telah melaksanakan bendera, anda akan memiliki untuk menghapus mengeksekusi bendera pertama. +X doesn't menghapus mengeksekusi bendera dari file yang sudah memilikinya.
Contoh:
chmod -R ugo-x,u+rwX,go+rX,go-w path
Update: ini tampaknya gagal karena perubahan pertama (ugo-x) membuat direktori unexecutable, jadi semua file di bawah ini yang tidak berubah.
Saya memutuskan untuk menulis sebuah script kecil untuk diriku sendiri.
Rekursif chmod script untuk dirs dan/atau file — Gist:
chmodr.sh
#!/bin/sh
#
# chmodr.sh
#
# author: Francis Byrne
# date: 2011/02/12
#
# Generic Script for recursively setting permissions for directories and files
# to defined or default permissions using chmod.
#
# Takes a path to recurse through and options for specifying directory and/or
# file permissions.
# Outputs a list of affected directories and files.
#
# If no options are specified, it recursively resets all directory and file
# permissions to the default for most OSs (dirs: 755, files: 644).
# Usage message
usage()
{
echo "Usage: $0 PATH -d DIRPERMS -f FILEPERMS"
echo "Arguments:"
echo "PATH: path to the root directory you wish to modify permissions for"
echo "Options:"
echo " -d DIRPERMS, directory permissions"
echo " -f FILEPERMS, file permissions"
exit 1
}
# Check if user entered arguments
if [ $# -lt 1 ] ; then
usage
fi
# Get options
while getopts d:f: opt
do
case "$opt" in
d) DIRPERMS="$OPTARG";;
f) FILEPERMS="$OPTARG";;
\?) usage;;
esac
done
# Shift option index so that $1 now refers to the first argument
shift $(($OPTIND - 1))
# Default directory and file permissions, if not set on command line
if [ -z "$DIRPERMS" ] && [ -z "$FILEPERMS" ] ; then
DIRPERMS=755
FILEPERMS=644
fi
# Set the root path to be the argument entered by the user
ROOT=$1
# Check if the root path is a valid directory
if [ ! -d $ROOT ] ; then
echo "$ROOT does not exist or isn't a directory!" ; exit 1
fi
# Recursively set directory/file permissions based on the permission variables
if [ -n "$DIRPERMS" ] ; then
find $ROOT -type d -print0 | xargs -0 chmod -v $DIRPERMS
fi
if [ -n "$FILEPERMS" ] ; then
find $ROOT -type f -print0 | xargs -0 chmod -v $FILEPERMS
fi
Pada dasarnya tidak rekursif chmod tapi juga memberikan sedikit fleksibilitas untuk opsi baris perintah (set direktori dan/atau file permissions, atau mengecualikan kedua hal itu secara otomatis me-reset segalanya untuk 755-644). Hal ini juga memeriksa untuk kesalahan beberapa skenario.
Saya juga menulis tentang ini di blog saya]1.
Untuk rekursif memberikan direktori baca&melaksanakan hak:
find /path/to/base/dir -type d -exec chmod 755 {} \;
Untuk rekursif memberikan file baca keistimewaan:
find /path/to/base/dir -type f -exec chmod 644 {} \;
Lebih baik terlambat daripada tidak pernah membiarkan saya upgrade nik's jawaban di sisi kebenaran. Solusi saya adalah lebih lambat, tetapi bekerja dengan sejumlah file, dengan simbol-simbol di nama file, dan anda dapat menjalankannya dengan sudo biasanya (tapi hati-hati bahwa itu mungkin menemukan file yang berbeda dengan sudo).
Cobalah skrip python ini; hal ini tidak memerlukan proses pemijahan dan tidak hanya dua saat per file. Terlepas dari implementasi dalam C, itu mungkin akan menjadi cara tercepat untuk melakukan hal itu (yang saya butuhkan untuk memperbaiki filesystem dari 15 juta file yang semua 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, mencoba menangkap diperlukan sekitar lalu chmod, sejak chmodding beberapa file khusus yang gagal.
Anda juga dapat menggunakan pohon
:
tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1"' -- '{}'
dan jika anda juga ingin melihat folder menambahkan echo
tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1" && echo$1' -- '{}'
Anda bisa menggunakan kode berikut script bash sebagai contoh. Pastikan untuk memberikan hak akses executable (755). Cukup menggunakan ./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