通过脚本或 nautilus 菜单仅递归 chmod 文件夹或仅文件?

通过脚本或 nautilus 菜单仅递归 chmod 文件夹或仅文件?

这个之前已经讨论过这里

我想知道的是如何转变这些:

仅递归 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

相关内容