パーミッション – ファイル以外のすべてのディレクトリを再帰的にchmodする方法は?

chmod permissions

どのようにchmod 755すべてのディレクトリが、(再帰的に)ファイルがありませんか?

逆に、ファイルだけを(再帰的に)chmodして、ディレクトリを作らない方法は?

  637  Olivier Lalonde  2010-01-06


ベストアンサー

ディレクトリに再帰的に読み取り&実行権限を与える

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

882  nik  2010-01-06


この手のことでよくあるのが、ディレクトリを755にしてファイルを644にすることです。この場合、nikさんのfindの例よりも少し手っ取り早い方法があります

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

Meaning:

  • -R=再帰的に;
  • u+rwX = ユーザーが読み書きして実行することができます;
  • go+rX = グループと他の人が読んで実行できる;
  • go-w=グループで他の人は書けない

ここで注意しなければならないのは、大文字のXと小文字のxでは動作が異なるということです。マニュアルでは

ファイルがディレクトリである場合のexecute/searchビット、またはexecute/searchビットのいずれかが元の(変更されていない)モードで設定されている場合のexecute/searchビット

言い換えれば、ファイル上で chmod u+X を実行ビットに設定しても実行ビットは設定されません

318  bobince  2010-01-06


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

Example:

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

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

15  mpolden  2010-01-22


これは自分で少し台本を書くことにしました

ディレクトリやファイルのための再帰的 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 にリセットします)。また、いくつかのエラーシナリオをチェックします

また、私のブログにも書きました

4  francisbyrne  2012-09-18


ディレクトリに再帰的に読み取り&実行権限を与える

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

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

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

正しさの側で私にnikの答えをアップグレードさせてくれないよりは、より良い遅さ。私の解答は遅いですが、ファイル名の中の任意のシンボルで、任意の数のファイルで動作し、普通にsudoで実行することができます(しかし、sudoで異なるファイルを検出する可能性があることに注意してください)

3  Peter K  2018-02-21


この 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 が失敗したので、最後の chmod のあたりでトライ/キャッチが必要でした

2  mic_e  2013-03-26


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' -- '{}'

-1  Eduard Florinescu  2018-02-16


以下のようなbashスクリプトを例に挙げることができます。必ず実行可能なパーミッション(755)を与えてください。カレントディレクトリには./autochmod.shを、別のディレクトリを指定するには./autochmod.sh <dir>を使用してください

#!/bin/bash

if [ -e $1 ]; then
if [ -d $1 ];then
dir=$1
else
echo "No such directory: $1"
exit
fi
else
dir="./"
fi

for f in $(ls -l $dir | awk '{print $8}'); do
if [ -d $f ];then
chmod 755 $f
else
chmod 644 $f
fi
done

-2  user26528  2010-01-29


タイトルとURLをコピーしました