再帰的には、フォルダだけをchmodするか、スクリプトまたはノーチラスメニューを介してファイルのみをchmodしますか?

再帰的には、フォルダだけをchmodするか、スクリプトまたはノーチラスメニューを介してファイルのみをchmodしますか?

これは以前に議論されたことがあります。ここ

私が知りたいのはこれを変換する方法です。

このフォルダ内のファイルのみを再帰的にchmodします。

find . -type f -exec chmod 0600 {} \;

このフォルダ内の再帰的なchmodフォルダのみ:

find . -type d -exec chmod 0755 {} \;

bashスクリプトに変換すると、次のようになります。

ファイルの場合:

rchmodf 744 .

ディレクトリの場合:

rchmodd 755 .

そして…可能であれば、ノーチラスの右クリックメニューオプションに入ることもできます。

答え1

パターンを最初の引数として渡し、1つ以上のディレクトリ名を後続の引数として渡すことで、次のスクリプトを呼び出すことができます。 Linuxでは、ディレクトリ名を渡さない場合.(現在のディレクトリ)を渡すのと同じです。rchmodf実行可能にスクリプト名を指定chmod a+rx /path/to/rchmodfし()に配置します$PATH

#!/bin/sh
mode=$1; shift
find "$@" -type f -exec chmod "$mode" {} +

説明:mode=$1; shift変数をmodeスクリプトの最初の引数に設定し、リストからその最初の引数を削除します。"$@"すべてのパラメータのリストに展開されます。

必要に応じて、ディレクトリモードとファイルモードの両方を許可するスクリプトを作成できます。

#!/bin/sh
dir_mode=$1; shift
file_mode=$1; shift
find "$@" -type d -exec chmod "$dir_mode" {} + -o -type f -exec chmod "$file_mode" {} +

744は有用なファイルモードではありません。 644(ユーザーの書き込みと誰でも読むことができます)と755(また、誰でも実行可能)がより一般的です。さらに、ツリー内のすべてのファイルを実行可能または実行不可能に変更することはほとんど役に立ちません。次のパラメータを使用してこのスクリプトを呼び出す必要があります+rX(大文字X、すでに実行可能なディレクトリ、およびファイルに対してのみ実行可能ビットの設定)。実際には、Xシンボルモードは次のスクリプトを使用して必要なものですchmod -R +rX .

bashまたはzshを使用する別の再帰的な方法がありますが、ディレクトリに固有のものです。 Bashの場合はバージョン4が必要です。最初に実行してくださいshopt -s globstar

chmod a+rx **/*/

zshでは、サフィックス:を持つ(.)ファイルにのみ作業できますchmod a+r **/*(.)

ノーチラスの質問をお伝えします。

答え2

user23538がリンクしたスクリプトです。よろしくお願いします。

私はそれを試してみて、うまく動作します。 .をパス引数として使用すると(スクリプトと同じディレクトリで実行される)、実際にはスクリプト自体のファイル権限が644に変更されるため、上記のディレクトリに配置されます。

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

答え3

私は基本的に上記の操作を実行しましたが、コマンドラインオプション(ディレクトリおよび/またはファイル権限、またはその両方を除いてすべてを自動的に755-644にリセット)に柔軟性を提供するスクリプトを作成しました。また、いくつかのエラー条件も確認します。

http://bigfloppydonkeydisk.blogspot.com.au/2012/09/recursively-chmod-only-files-or.html

関連情報