Chmod đệ quy chỉ các thư mục hoặc chỉ các tệp qua menu script hoặc nautilus?


8

Điều này đã được thảo luận trước đây .

Những gì tôi muốn biết là làm thế nào để biến những thứ này:

Các tệp chmod đệ quy chỉ trong thư mục này:

find . -type f -exec chmod 0600 {} \;

Các thư mục chmod đệ quy trong thư mục này:

find . -type d -exec chmod 0755 {} \;

thành một tập lệnh bash, vì vậy nó có thể là một cái gì đó như:

Đối với tệp:

rchmodf 744 .

Đối với thư mục:

rchmodd 755 .

và ... cũng có thể vào một tùy chọn menu chuột phải nautilus nếu có thể.

Câu trả lời:


10

Đây là một tập lệnh mà bạn có thể gọi bằng cách chuyển chế độ làm đối số đầu tiên và một hoặc nhiều tên thư mục làm đối số tiếp theo. Trong Linux, nếu bạn không vượt qua bất kỳ tên thư mục nào, nó sẽ như thể bạn đã vượt qua .(thư mục hiện tại). Đặt tên cho kịch bản này rchmodf, làm cho nó có thể thực thi được ( chmod a+rx /path/to/rchmodf) và đặt nó ở đâu đó trên của bạn $PATH.

#!/bin/sh
mode=$1; shift
find "$@" -type f -exec chmod "$mode" {} +

Giải thích: mode=$1; shiftđặt biến modethành đối số đầu tiên của tập lệnh và xóa đối số đầu tiên đó khỏi danh sách. "$@"mở rộng đến danh sách tất cả các đối số.

Nếu bạn thích, bạn có thể tạo một tập lệnh chấp nhận cả chế độ thư mục và chế độ tệp.

#!/bin/sh
dir_mode=$1; shift
file_mode=$1; shift
find "$@" -type d -exec chmod "$dir_mode" {} + -o -type f -exec chmod "$file_mode" {} +

Lưu ý rằng 744 không phải là chế độ tệp hữu ích; 644 (người dùng có thể ghi và có thể đọc được trên thế giới) và 755 (cũng có thể thực hiện được trên thế giới) là phổ biến hơn nhiều. Ngoài ra, thay đổi mọi tệp trong cây để có thể thực thi hoặc không thực thi được hiếm khi hữu ích; có lẽ bạn sẽ muốn gọi tập lệnh này bằng các đối số như +rX(viết hoa X, để chỉ thiết lập bit thực thi cho các thư mục và cho các tệp đã được thực thi). Trong thực tế, Xchế độ biểu tượng có lẽ là những gì bạn đã có sau các tập lệnh này : chmod -R +rX ..

Với bash hoặc zsh, có một cách khác để hành động đệ quy nhưng chỉ trên các thư mục. Đối với bash, bạn cần phiên bản 4 và để chạy shopt -s globstartrước.

chmod a+rx **/*/

Trong zsh, bạn chỉ có thể hành động trên các tệp bằng cách nhập vào (.): chmod a+r **/*(.).

Tôi sẽ chuyển qua câu hỏi Nautilus.


Ninjas một nincompoops! Bạn có thể sử dụng một find để thực thi các lệnh khác nhau trên các tập kết quả khác nhau? +1 để nạp chồng toán tử OR.
Caleb

1

Script được liên kết bởi user23538, hy vọng bạn không phiền.

Tôi đã thử nó và nó hoạt động tốt. Xin lưu ý rằng nếu bạn sử dụng. là đối số đường dẫn (chạy nó trong cùng thư mục chứa tập lệnh), trên thực tế, nó thực sự thay đổi quyền của tập lệnh thành 644, vì vậy hãy đặt nó vào thư mục trên.

#!/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

@ user23538 đã được hướng dẫn để dán mã vào một khối trên trang web. Sau đó, bạn không nên đăng chính xác điều đó trừ khi bạn có thêm điều gì đó để thêm.
HalosGhost

Họ đã được hướng dẫn, nhưng họ đã không làm. Tôi cũng vậy. Đó là những gì được yêu cầu, ngay cả khi tôi không phải là cùng một người. Hãy giải thích tại sao điều này là không chính xác?
Kluny

Ahh, tôi đã bỏ lỡ cách đây bao lâu người dùng đã đăng câu trả lời của họ. Nếu bạn tìm thấy điều gì đó về câu trả lời của bạn để chỉnh sửa, tôi sẽ vui lòng xóa bỏ phiếu bầu của tôi.
HalosGhost

0

Tôi đã viết một kịch bản về cơ bản thực hiện các thao tác trên 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 (thư mục và / hoặc quyền 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.

http://bigfloppydonkeydisk.blogspot.com.au/2012/09/recursively-chmod-only-files-or.html


2
Bạn nên dán mã ở đây. Bằng cách đó, chúng tôi tránh được rất nhiều liên kết chết trong tương lai. Nếu bạn lo lắng về hai phiên bản trôi xa nhau, bạn vẫn có thể để lại liên kết ở đó để tham khảo.
l0b0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.