이는 이전에 논의된 적이 있습니다.여기.
내가 알고 싶은 것은 이것을 변환하는 방법입니다.
이 폴더에 있는 파일만 재귀적으로 chmod합니다.
find . -type f -exec chmod 0600 {} \;
이 폴더 내의 재귀적 chmod 폴더만:
find . -type d -exec chmod 0755 {} \;
bash 스크립트로 변환하면 다음과 같이 보일 수 있습니다.
파일의 경우:
rchmodf 744 .
디렉토리의 경우:
rchmodd 755 .
그리고...가능하다면 노틸러스 마우스 오른쪽 버튼 클릭 메뉴 옵션에 들어갈 수도 있습니다.
답변1
패턴을 첫 번째 인수로 전달하고 하나 이상의 디렉터리 이름을 후속 인수로 전달하여 다음 스크립트를 호출할 수 있습니다. Linux에서는 디렉터리 이름을 전달하지 않으면 .
(현재 디렉터리)를 전달하는 것과 같습니다. rchmodf
실행 가능하도록 스크립트 이름을 지정 chmod a+rx /path/to/rchmodf
하고( ) 에 배치합니다 $PATH
.
#!/bin/sh
mode=$1; shift
find "$@" -type f -exec chmod "$mode" {} +
설명: mode=$1; shift
변수를 mode
스크립트의 첫 번째 인수로 설정하고 목록에서 해당 첫 번째 인수를 제거합니다. "$@"
모든 매개변수 목록으로 확장됩니다.
원하는 경우 디렉터리 모드와 파일 모드를 모두 허용하는 스크립트를 만들 수 있습니다.
#!/bin/sh
dir_mode=$1; shift
file_mode=$1; shift
find "$@" -type d -exec chmod "$dir_mode" {} + -o -type f -exec chmod "$file_mode" {} +
744는 유용한 파일 모드가 아닙니다. 644(사용자 쓰기 및 누구나 읽을 수 있음) 및 755(또한 누구나 실행 가능)가 더 일반적입니다. 더욱이 트리의 모든 파일을 실행 가능 또는 실행 불가능으로 변경하는 데는 거의 소용이 없습니다. 다음 매개변수를 사용하여 이 스크립트를 호출해야 할 수도 있습니다 +rX
(대문자 X
, 이미 실행 가능한 디렉터리 및 파일에 대해서만 실행 가능 비트 설정). 실제로 X
기호 모드는 다음 스크립트를 사용하여 원하는 것일 수 있습니다 chmod -R +rX .
.
bash 또는 zsh를 사용하는 또 다른 재귀 방법이 있지만 디렉토리에만 해당됩니다. Bash의 경우 버전 4가 필요하며 먼저 실행하세요 shopt -s globstar
.
chmod a+rx **/*/
zsh에서는 접미사 :가 있는 (.)
파일에만 작업 할 수 있습니다 chmod a+r **/*(.)
.
노틸러스의 질문을 전달하겠습니다.
답변2
user23538이 링크한 스크립트입니다. 괜찮기를 바랍니다.
나는 그것을 시도했고 훌륭하게 작동합니다. .를 경로 인수로 사용하면(스크립트와 동일한 디렉터리에서 실행) 실제로 스크립트 자체의 파일 권한이 644로 변경되므로 위 디렉터리에 배치됩니다.
#!/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
답변3
나는 기본적으로 위의 작업을 수행하지만 명령줄 옵션(디렉터리 및/또는 파일 권한 또는 둘 다를 제외하고 모든 것을 자동으로 755-644로 재설정)에 유연성을 제공하는 스크립트를 작성했습니다. 또한 일부 오류 조건도 확인합니다.
http://bigfloppydonkeydisk.blogspot.com.au/2012/09/recursively-chmod-only-files-or.html