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


24

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

在Ubuntu Linux计算机上,错误地将一堆文件复制到具有全部777权限(用户,组,其他-读取,写入,执行)的USB磁盘。我想将它们放回更正后的用户目录中。

目录应该为775,所有其他文件都可以为664。所有文件都是图像,文档或MP3,因此它们都不是可执行文件。如果设置了目录位,则需要执行,否则,仅需要用户和组,读取和写入。

我认为值得一提的是,在一起破解Shell脚本之前是否存在这样的实用程序:)


这是我之前制作的:http
Tim Abell,2009年

Answers:


51

这应该可以解决问题:

find /home/user -type d -print0 | xargs -0 chmod 0775
find /home/user -type f -print0 | xargs -0 chmod 0664

1
+1(使用-print0 / xargs -0 :-)。
sleske

14

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)


6
比使用xargs慢,因为您要为每个文件分派chmod,因为xargs将运行chmod进程,并在命令行上容纳尽可能多的文件。在非常大的树上,这可以带来很大的不同。
David Pashley,2009年

1
同样,print0 / xargs -0甚至可以处理非常奇怪的文件名;不太确定find -exec。
sleske

8

这个答案不能解决您的问题,但是有人可能会发现它对于类似的问题很有用,因为文件的权限少于应有的权限。

# chmod -R . u=rwX,g=rX,o=rX

魔术是X权限,而不是x。chmod联机帮助页对此进行了描述:

仅当文件是目录或已经对某些用户具有执行权限时才执行/搜索

这不适用于您的情况,因为您的文件具有执行权限,因此将与第二个测试匹配。


1
克应RWX为775和664
砂金石

1

我用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
颠覆了

这几乎是正确的;但是如果目标是目录,则您忘记对其中的文件进行chmod了,而如果它是文件,则只需要对该文件进行chmod。
肖恩

0

如果您使用的是ssh,最好不要修改~/.ssh权限。

DIR=/home/user
find $DIR -type d -not -path "$DIR/.ssh" -print0 | xargs -0 chmod 0775
find $DIR -type f -not -path "$DIR/.ssh/*" -print0 | xargs -0 chmod 0664

0

前几天,我做了一个非常简单的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

0

我找到了一个简化的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

1
这不仅重复了一些答案,还引入了OP不需要的错误和功能。
拉尔夫·弗里德尔

0

一种替代方案不是象征性地准确地响应原始请求,而更可能是OP的意图,它是象征性地指定权限。例如,我假设OP希望“为公众删除写访问权限,并从所有文件中删除可执行权限”。

如果使用符号权限表示,则有可能。

  • ow是“从公共场所删除写访问权限”(“ o”-其他,“-”-删除,“ w”-写)
  • ax是“仅对文件中的每个人都删除执行”(“ a”-全部,“-”-删除,“ x”-执行)

用这种方式写出来而不是显式设置“ 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 {} +
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.