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


8

这已经在这里讨论过

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

仅此文件夹中的递归chmod文件:

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

仅此文件夹中的递归chmod文件夹:

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

到bash脚本中,因此可能类似于:

对于文件:

rchmodf 744 .

对于目录:

rchmodd 755 .

并且...如果可能的话,还可以放入鹦鹉螺右键菜单选项。

Answers:


10

这是一个脚本,您可以通过将mode作为第一个参数,并将一个或多个目录名称作为后继参数来进行调用。在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(capital的参数)调用此脚本X,以仅对目录和已经可执行的文件设置可执行位。实际上,X这些脚本可能是您追求的符号模式:chmod -R +rX .

使用bash或zsh,还有另一种递归操作的方法,但仅适用于目录。对于bash,您需要版本4并首先运行shopt -s globstar

chmod a+rx **/*/

在zsh中,只能通过后缀(.):对文件进行操作chmod a+r **/*(.)

我将传递Nautilus问题。


忍者一个忍者!您可以使用一个查找对不同的结果集执行不同的命令吗?+1用于重载OR运算符。
Caleb

1

由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

已经指示@ user23538将代码粘贴到现场的代码块中。然后,除非您需要添加其他内容,否则不应该发布确切的内容。
HalosGhost

他们被指示去做,但没有。所以我做了。即使我不是同一个人,也是如此。请解释为什么这是不正确的?
Kluny 2014年

啊,我错过了用户发布答案的时间。如果您发现有关修改答案的信息,我们很乐意删除我的不赞成票。
HalosGhost 2014年

0

我编写了一个脚本,基本上可以完成上述操作,但是还为命令行选项(目录和/或文件权限,或者排除两者)提供了一定的灵活性,它将所有内容自动重置为755-644。它还检查一些错误情况。

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


2
您应该在此处粘贴代码。这样一来,我们就可以避免将来出现许多死链接。如果您担心两个版本会分开,则仍可以保留链接以供参考。
l0b0 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.