Làm thế nào để chmod 755 tất cả các thư mục nhưng không có tệp (đệ quy)?
Ngược lại, làm thế nào để chmod chỉ các tệp (đệ quy) nhưng không có thư mục?
Làm thế nào để chmod 755 tất cả các thư mục nhưng không có tệp (đệ quy)?
Ngược lại, làm thế nào để chmod chỉ các tệp (đệ quy) nhưng không có thư mục?
Câu trả lời:
Để đệ quy cho các thư mục đọc và thực thi các đặc quyền:
find /path/to/base/dir -type d -exec chmod 755 {} +
Để đệ quy các tệp đọc đặc quyền:
find /path/to/base/dir -type f -exec chmod 644 {} +
Hoặc, nếu có nhiều đối tượng để xử lý:
chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)
Hoặc, để giảm chmod
sinh sản:
find /path/to/base/dir -type d -print0 | xargs -0 chmod 755
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644
-bash: /bin/chmod: Argument list too long
. Lệnh cuối cùng hoạt động với nhiều tệp, nhưng khi sử dụng, sudo
người ta phải cẩn thận đặt nó trước xargs thay vì chmod:find /path/to/base/dir -type d -print0 | sudo xargs -0 chmod 755
dir
cũng sẽ được đặt thành 755.
chmod ... $(find /path/to/base/dir -type ...)
thất bại cho tên tập tin với không gian trong tên.
find /path/to/base/dir -type d -exec chmod 755 {} \;
( find /path/to/base/dir -type f -exec chmod 644 {} \;
).
Một lý do phổ biến cho loại điều này là đặt thư mục thành 755 nhưng tệp thành 644. Trong trường hợp này có một cách nhanh hơn một chút so với find
ví dụ của nik :
chmod -R u+rwX,go+rX,go-w /path
Ý nghĩa:
-R
= đệ quy;u+rwX
= Người dùng có thể đọc, viết và thực hiện;go+rX
= nhóm và những người khác có thể đọc và thực hiện;go-w
= nhóm và những người khác không thể viếtĐiều quan trọng cần lưu ý ở đây là chữ hoa X
hoạt động khác với chữ thường x
. Trong hướng dẫn chúng ta có thể đọc:
Các bit thực hiện / tìm kiếm nếu tệp là một thư mục hoặc bất kỳ bit thực hiện / tìm kiếm nào được đặt ở chế độ ban đầu (không sửa đổi).
Nói cách khác, chmod u + X trên một tệp sẽ không đặt bit thực thi; và g + X sẽ chỉ đặt nó nếu nó đã được đặt cho người dùng.
chmod -R 777
do +X
tùy chọn sẽ không đặt lại các bit thực thi hiện có trên các tệp. Sử dụng -x sẽ thiết lập lại các thư mục và ngăn không cho chúng đi xuống.
X
, như được giải thích trong các bình luận.
go+rX,go-w
-> go=rX
phải không?
chmod u-x,u+X
kết hợp, v.v., để loại bỏ các bit thực thi cho các tệp, nhưng thêm chúng vào các thư mục.
Nếu bạn muốn đảm bảo các tệp được đặt thành 644 và có các tệp trong đường dẫn có cờ thực thi, trước tiên bạn sẽ phải xóa cờ thực thi. + X không xóa cờ thực thi khỏi các tệp đã có.
Thí dụ:
chmod -R ugo-x,u+rwX,go+rX,go-w path
Cập nhật: điều này dường như không thành công vì thay đổi đầu tiên (ugo-x) làm cho thư mục không thể thực hiện được, vì vậy tất cả các tệp bên dưới nó không bị thay đổi.
chmod -R ugo-x path
, đó có thể là một vấn đề. Nhưng lệnh hoàn chỉnh sẽ thực hiện chmod u+rwX
trên mỗi thư mục trước khi nó cố gắng truy cập vào nó.) Tuy nhiên, tôi tin rằng điều đó chmod R u=rw,go=r,a+X path
là đủ - và nó ngắn hơn.
Tôi quyết định tự viết một kịch bản nhỏ cho việc này.
Tập lệnh chmod đệ quy cho thư mục và / hoặc tệp - 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
Về cơ bản, nó thực hiện chmod đệ quy nhưng cũng cung cấp một chút linh hoạt cho các tùy chọn dòng lệnh (đặt quyền truy cập thư mục và / hoặc tệp, hoặc loại trừ cả hai nó tự động đặt lại mọi thứ thành 755-644). Nó cũng kiểm tra một vài tình huống lỗi.
Tôi cũng đã viết về nó trên blog của tôi .
Để đệ quy cho các thư mục đọc và thực thi các đặc quyền:
find /path/to/base/dir -type d -exec chmod 755 {} \;
Để đệ quy các tệp đọc đặc quyền:
find /path/to/base/dir -type f -exec chmod 644 {} \;
Muộn còn hơn không bao giờ để tôi nâng cấp câu trả lời của nik về mặt chính xác. Giải pháp của tôi chậm hơn, nhưng nó hoạt động với bất kỳ số lượng tệp nào, với bất kỳ ký hiệu nào trong tên tệp và bạn có thể chạy nó với sudo bình thường (nhưng hãy cẩn thận rằng nó có thể phát hiện ra các tệp khác nhau bằng sudo).
Hãy thử kịch bản python này; nó không yêu cầu sinh sản của các quá trình và chỉ có hai tòa nhà trên mỗi tệp. Ngoài việc triển khai trong C, nó có thể sẽ là cách thực hiện nhanh nhất (tôi cần nó để sửa một hệ thống tệp gồm 15 triệu tệp được đặt thành 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)
Trong trường hợp của tôi, một thử / bắt được yêu cầu xung quanh chmod cuối cùng, vì việc chỉnh sửa một số tệp đặc biệt không thành công.
Bạn cũng có thể sử dụng tree
:
tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1"' -- '{}'
và nếu bạn cũng muốn xem thư mục thêm tiếng vang
tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1" && echo$1' -- '{}'
xargs
các vấn đề. Các trích dẫn đơn trong tên tệp là một vấn đề đối với nhiều lệnh và tập lệnh, đó là lý do tại sao tôi liệt kê tất cả các tệp có chứa dấu ngoặc đơn và loại bỏ chúng (ý tôi trích dẫn)
Bạn có thể sử dụng tập lệnh bash sau đây làm ví dụ. Hãy chắc chắn cung cấp cho nó quyền thực thi (755). Chỉ cần sử dụng ./autochmod.sh cho thư mục hiện tại hoặc ./autochmod.sh <dir> để chỉ định một thư mục khác.
#!/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
$1
không phải là null, nhưng không phải là tên của một thư mục (ví dụ: là một lỗi đánh máy), thì dir
sẽ được đặt thành .
không có tin nhắn. (2) $1
nên "$1"
và $dir
nên "$dir"
. (3) Bạn không cần phải nói "./"
; "."
là tốt (và, nói đúng ra, bạn không cần trích dẫn ở đây). (4) Đây không phải là một giải pháp đệ quy. (5) Trên hệ thống của tôi, ls -l … | awk '{ print $8 }'
nhận thời gian sửa đổi của tệp. Bạn cần { print $9 }
lấy từ đầu tiên của tên tệp. Và thậm chí sau đó, (6) điều này không xử lý tên tệp có khoảng trắng. Tập
chmod
tự động đến 644, do đó làm cho chính nó không thể thực thi được!