Answers:
find可以单独使用-exec来解决问题:
find /home/user -type f -exec chmod 0664 {} \;
find /home/user -type d -exec chmod 0775 {} \;
防止find为每个条目生成chmod:
find /home/user -type f -exec chmod 0664 {} +
find /home/user -type d -exec chmod 0775 {} +
(这实际上以所有文件列表作为参数而不是每个文件一个chmod一次调用chmod)
我用freiheit的解决方案制作了一个脚本,它添加了基本的参数检查。
#!/bin/sh
if [ $# -lt 1 ]; then
echo "USAGE: $0 <path>"
exit 1
fi
find $1 -type d -print0 | xargs -0 chmod 0755
find $1 -type f -print0 | xargs -0 chmod 0644
chmod: missing operand after ‘0644’
。我是否可以建议在find语句中加上检查以查看目标是否存在?if [ -d $1 ]; then find $1 -type d -print0 | xargs -0 chmod 0755; fi; if [ -f $1 ]; then find $1 -type f -print0 | xargs -0 chmod 0644; fi
前几天,我做了一个非常简单的bash脚本,因为我需要修复权限。为什么没有正式的实用程序来重置基本,非root,文件和文件夹权限?
该脚本使用find来查找755个所有文件夹和644个库。然后,它使用readelf测试每个文件,以查看它是否具有二进制elf头。如果不是,它将在前两个字符中扫描shebang #!
。在检查文件是否已具有匹配权限之后,它将检查这些实例755个,并检查其他644个其他对象。
特殊情况下会处理例外情况,例如*.bak
将忽略for文件。
#!/bin/bash
read -r -p "Correct file and folder permissions? [y/N] " chse
if [[ "$chse" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
echo "Processing ..."
find -H $(pwd) -type d -exec chmod 0755 {} \;
# set dirs to 755
find -H $(pwd) -type f \( -iname '*.so.*' -o -iname '*.so' \) -exec chmod 0644 {} \;
# libs
IFS=$'\n'
for value in $(find -H $(pwd) -type f ! \( -iname '*.so.*' -o -iname '*.so' -o -iname '*.bak' \) -printf '%p\n'); do
tstbin=$(readelf -l "$value" 2>/dev/null | grep -Pio 'executable|shared')
if [ -z "$tstbin" ]; then
tstbat=$(cat "$value" | head -c2 | grep -io '#!')
if [ -n "$tstbat" ]; then
perm=$(stat -c '%a' "$value")
if [ "$perm" != "755" ]; then
chmod 755 $value
echo "Set script 755 $value"
# set batch to 755
fi
else
perm=$(stat -c '%a' "$value")
if [ "$perm" != "644" ]; then
chmod 644 $value
echo "Set regular 644 $value"
# set regular files to 644
fi
fi
# above aren't elf binary
else
perm=$(stat -c '%a' "$value")
if [ "$perm" != "755" ]; then
chmod 755 $value
echo "Set binary 755 $value"
# set elf binaries to 755
fi
fi
done
unset IFS
# process linux permissions for files and folders
else
echo "Aborted."
fi
我找到了一个简化的C-shell解决方案。这可能并不完全可靠,但应该适用于大多数目录。它假定Unix的'file'命令起作用,并找到exec文件以将其重置为exec权限:
find /home/user -type d | xargs chmod 0775
find /home/user -type f | xargs -0 chmod 0664
find /home/user -type f -exec file {} \; | grep executable | cut -d":" -f1 | xargs chmod 0775
一种替代方案不是象征性地准确地响应原始请求,而更可能是OP的意图,它是象征性地指定权限。例如,我假设OP希望“为公众删除写访问权限,并从所有文件中删除可执行权限”。
如果使用符号权限表示,则有可能。
用这种方式写出来而不是显式设置“ 0664”,可以避免意外地为先前锁定的文件提供额外的权限。例如,如果文件为0770,它将不会错误地变为0664。
要执行第一个要求,您可以使用chmod
:
chmod --recursive o-w $dir
要执行第二个要求:
find $dir -type f -exec chmod a-x {} +
或同时执行以下操作:
find $dir -type f -exec chmod a-x,o-w {} +
find $dir -type d -exec chmod o-w {} +