是否有人有可以递归地纠正目录上的文件权限的工具或脚本?
在 Ubuntu Linux 机器上,错误地将一堆文件复制到具有完整 777 个权限(用户、组、其他 - 读取、写入、执行)的 USB 磁盘。我想将它们放回到更正后的用户目录中。
目录应为 775,所有其他文件可以是 664。所有文件都是图像、文档或 MP3,因此它们都不需要可执行。如果设置了目录位,则需要执行,否则只需要用户和组、读取和写入。
我认为在编写 shell 脚本之前有必要检查是否存在这样的实用程序 :)
答案1
这应该可以解决问题:
find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664
答案2
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)
答案3
这个答案不能解决您的问题,但有人可能会发现它对于文件权限不足的类似问题很有用。
# chmod -R . u=rwX,g=rX,o=rX
魔法是 X 权限,而不是 x。 chmod 手册页对此进行了如下描述:
仅当文件是目录或某些用户已具有执行权限时才执行/搜索
这不适合您的情况,因为您的文件具有执行权限,因此将匹配第二个测试。
答案4
前几天,我编写了一个非常简单的 bash 脚本,因为我需要修复权限。为什么没有正式的实用程序来重置基本、非 root、文件和文件夹权限?
该脚本使用 find 查找所有文件夹和库。然后,它使用 readelf 测试每个文件,以查看它是否具有二进制 elf 标头。如果没有,它会扫描前两个字符以查找 shebang #!
。它会检查这些实例和其余所有内容,然后检查文件是否已经具有匹配的权限。
特殊情况将通过异常来处理,例如*.bak
要忽略的文件。
#!/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