Рекурсивные папки chmod only или только файлы через скрипт или меню nautilus?

8

Это обсуждалось ранее здесь .

То, что я хотел бы знать, как повернуть это:

Рекурсивные файлы chmod only в этой папке:

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

Рекурсивные папки chmod only в этой папке:

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

в сценарий bash, так что это может быть что-то вроде:

Для файлов:

rchmodf 744 .

Для каталогов:

rchmodd 755 .

и ... также, возможно, в контекстном меню наутилуса, если это возможно.

DM8
источник

Ответы:

10

Вот скрипт, который вы можете вызвать, передав режим в качестве первого аргумента и одно или несколько имен каталогов в качестве последующих аргументов. В 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 **/*(.).

Я передам вопрос о Наутилусе.

Жиль "ТАК - перестань быть злым"
источник
Ниндзя и ниндкомпупы! Вы можете использовать одну находку для выполнения разных команд с разными наборами результатов? +1 за перегрузку оператора ИЛИ.
Калеб
1

Скрипт связан с 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
Kluny
источник
Пользователь @ user23538 уже получил указание вставить код в блок на месте. Вы не должны тогда публиковать именно это, если у вас нет чего-то еще, чтобы добавить.
HalosGhost
Они были проинструктированы, но они этого не сделали. Так я и сделал. Это то, что было запрошено, даже если я не тот же человек. Пожалуйста, объясните, почему это неправильно?
Клуны
Ах, я пропустил, как давно пользователь опубликовал свой ответ. Если вы найдете что-то в своем ответе для редактирования, я буду рада удалить мой отрицательный голос.
HalosGhost
0

Я написал сценарий, который в основном выполняет все вышеперечисленное, но также предоставляет некоторую гибкость для параметров командной строки (права доступа к каталогу и / или файлу, или исключает оба, он автоматически сбрасывает все до 755-644). Он также проверяет несколько сценариев ошибок.

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

user23538
источник
2
Вы должны вставить код здесь. Таким образом, мы избежим много мертвых ссылок в будущем. Если вас беспокоит расхождение двух версий, вы все равно можете оставить ссылку для справки.
10