需要修复用户主目录中的文件权限

需要修复用户主目录中的文件权限

是否有人有可以递归地纠正目录上的文件权限的工具或脚本?

在 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

相关内容