web-dev-qa-db-ja.com

ファイル以外のすべてのディレクトリを再帰的にchmodするにはどうすればいいですか?

755すべてのディレクトリをchmodして、ファイルを再構築する方法は?(再帰的)

逆に、ファイルのみを再帰的にchmodし、ディレクトリを変更しない方法は?

558
Olivier Lalonde

再帰的にディレクトリに読み取りと実行の権限を与えます。

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

再帰的にファイルに読み取り権限を与えるには

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

あるいは、処理するオブジェクトが多数ある場合は、

chmod 755 $(find /path/to/base/dir -type d)
chmod 644 $(find /path/to/base/dir -type f)

あるいは、chmodの産卵を減らすために:

find /path/to/base/dir -type d -print0 | xargs -0 chmod 755 
find /path/to/base/dir -type f -print0 | xargs -0 chmod 644
780
nik

この種の一般的な理由は、ディレクトリを755に、ファイルを644に設定することです。この場合、nikのfindの例よりもわずかに速い方法があります。

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

意味:

  • -R =再帰的。
  • u+rwX =ユーザーは読み取り、書き込み、実行できます。
  • go+rX = groupおよび他の人が読み取りおよび実行できます。
  • go-w = groupと他の人は書くことができません

ここで注意すべき重要なことは、大文字のXは小文字のxとは異なる動作をするということです。マニュアルでは読むことができます:

ファイルがディレクトリの場合、またはいずれかの実行/検索ビットが元の(変更されていない)モードに設定されている場合は、実行/検索ビット。

つまり、ファイルに対するchmod u + Xは実行ビットを設定しません。 g + Xは、それがすでにユーザーに設定されている場合にのみ設定します。

282
bobince

ファイルが644に設定されていて、実行フラグを持つファイルがパスにあることを確認したい場合は、最初に実行フラグを削除する必要があります。 + Xは既にそれを持っているファイルから実行フラグを削除しません。

例:

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

更新:最初の変更(ugo-x)はディレクトリを実行不可能にし、その下にあるすべてのファイルは変更されないため、これは失敗するようです。

13
mpolden

私はこれのために小さなスクリプトを自分で書くことにしました。

ディレクトリやファイルの再帰的なchmodスクリプト - 要旨

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にリセットする)にも柔軟性を提供します。また、いくつかのエラーシナリオもチェックします。

私のブログにも と書いています

4
francisbyrne

再帰的にディレクトリに読み取りと実行の権限を与えます。

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

再帰的にファイルに読み取り権限を与えるには

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

正しさの面で私の答えを決してアップグレードさせないよりは遅い方がいいです。私の解決策は遅くなりますが、それはファイル名の中の任意のシンボルでどんな数のファイルでも動作します、そしてあなたは普通にSudoでそれを実行することができます.

2
Peter K

このPythonスクリプトを試してください。プロセスを生成する必要はなく、ファイルごとに2つのsyscallだけを行います。 Cでの実装は別として、それはおそらくそれをする最も速い方法でしょう(私はすべて777に設定された1500万ファイルのファイルシステムを修正するためにそれを必要としました)

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

私の場合は、特殊なファイルをchmoddingするのに失敗したため、最後のchmodの前後でtry/catchが必要でした。

0
mic_e