2010-01-06 01:56:57 +0000 2010-01-06 01:56:57 +0000
593
593

如何递归chmod除文件外的所有目录?

如何chmod 755所有目录,但没有文件(递归)?

反过来,如何只对文件进行chmod(递归),而不对目录进行chmod?

答案 (8)

821
821
821
2010-01-06 01:58:44 +0000
302
302
302
2010-01-06 03:22:25 +0000

这类事情的常见原因是将目录设置为755,但文件设置为644。在这种情况下,有一个比nik的find的例子稍微快一点的方法:

chmod -R u+rwX,go+rX,go-w /path

意思是: - -R = 递归; - u+rwX = 用户可以读、写、执行; - go+rX = 组和其他人可以读、写、执行; - go-w = 组和其他人不能写

这里要注意的是,大写的X和小写的x的作用是不同的。在手册中我们可以读到:

如果文件是一个目录,或者任何一个执行/搜索位被设置为原始模式(未修改),则执行/搜索位。

14
14
14
2010-01-22 16:14:43 +0000

如果你想确保文件被设置为644,并且路径中的文件有执行标志,你必须先移除执行标志。+X不会从已经有执行标志的文件中移除执行标志。

例子:

chmod -R ugo-x,u+rwX,go+rX,go-w path

更新:这似乎是失败的,因为第一次更改(ug-x)使目录无法执行,所以它下面的所有文件都没有被更改。

4
4
4
2012-09-18 14:00:17 +0000

我决定自己写一个小脚本。 递归chmod脚本 - Gist : chmodr.sh

#!/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

它基本上可以做递归chmod,但也提供了一些命令行选项的灵活性(设置目录和/或文件权限,或者同时排除这两个选项,它会自动将所有的东西重置为755-644)。

我在博客上也写了一些关于它的内容。

2
2
2
2018-02-21 11:58:41 +0000

递归给目录读取和执行权限:

find /path/to/base/dir -type d -exec chmod 755 {} \;

递归给文件读取权限:

find /path/to/base/dir -type f -exec chmod 644 {} \;

迟来的比没来的好,让我把nik的答案升级到正确性的一边。我的解决方案比较慢,但它可以处理任何数量的文件,文件名中的任何符号,你可以用sudo正常运行(但要注意的是,它可能会用sudo发现不同的文件)。

0
0
0
2013-03-26 04:37:44 +0000

试试这个python脚本;它不需要生成进程,每个文件只需要进行两次系统调用。除了用C语言实现之外,它可能是最快的方法(我需要它来修复一个1500万个文件系统,这些文件都被设置为777)

#!/usr/bin/python3
import os
for par, dirs, files in os.walk('.'):
    for d in dirs:
        os.chmod(par + '/' + d, 0o755)
    for f in files:
        os.chmod(par + '/' + f, 0o644)

在我的例子中,在最后一次chmod时需要尝试/捕获,因为chmoding一些特殊文件失败了。

-1
-1
-1
2018-02-16 09:34:58 +0000

你也可以使用tree

tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1"' -- '{}'

,如果你想同时查看文件夹,可以添加回声

tree -faid /your_directory | xargs -L1 -I{} bash -c 'sudo chmod 755 "$1" && echo$1' -- '{}'
-2
-2
-2
2010-01-29 11:56:05 +0000

你可以用下面的bash脚本作为例子。一定要给它一个可执行的权限(755)。只需使用 ./autochmod.sh 来指定当前目录,或者使用 ./autochmod.sh <dir> 来指定不同的目录。