Как я могу изменить права доступа к файлам и каталогам за один раз через SSH?

856
SebinNyshkim

Я пытаюсь использовать findсовместно с -execи chmodрекурсивно изменить разрешения для каждого файла и каталога в папке через SSH.

Я хочу сделать эти две команды в одной строке:

find /share/Multimedia/ -type f -exec chmod 644 {} \; find /share/Multimedia/ -type d -exec chmod 755 {} \; 

Я смог найти решение до того, как кто-то еще что-нибудь разместил, и по какой-то причине моя история команд bash была очищена, и я не записал синтаксис, который использовал в другом месте для справки. Я не часто делаю это, поэтому я не слишком разбираюсь в стандартных командах Unix.

Я использовал что-то вроде:

# probably won't execute find /share/Multimedia/ ( if -type f -exec chmod 644 {} \; else if -type d -exec chmod 755 {} \; ) 

Я только хочу запускать это на моем NAS время от времени, чтобы нормализовать разрешения за один раз, возможно, без присмотра, чтобы сделать что-то еще в это время, пока мой NAS обрабатывает это.

0

2 ответа на вопрос

2
Suicideboy

Прежде всего, ifэто ключевое слово для оболочки, а не для поиска, вы не можете использовать его в качестве опции.

Во-вторых, вы, вероятно, ищете что-то подобное:

find /share/Multimedia/ -exec sh -c 'if [ -f {} ]; then chmod 644 {}; else chmod 755 {}; fi' \; 

Мы просто проверяем, является ли элемент файлом с нашей оболочкой, if [ -f {} ]затем мы выполняем команду chmod для файла или каталога.

1
Gordon Davisson

Вы можете использовать преимущества и / или структуру системы findвыражений для этого:

find /share/Multimedia/ -type f -exec chmod 644 {} \; -o -type d -exec chmod 755 {} \; 

По сути, это имеет следующую логику:

IF: the item is a plain file AND the chmod 644 command succeeds on it OR the item is a directory AND the chmod 755 command succeeds on it THEN ... well, do nothing; normally it'd print the item's path, but since there's a -exec in the expression, that gets skipped 

Но на самом деле есть гораздо более простой способ:

chmod -R u=rwX,go=rX /share/Multimedia/ 

Для этого используется chmodразрешение «X», что означает «выполнить, но только если это имеет смысл». В основном это означает, что он устанавливает выполнение для каталогов, но не для простых файлов. Основная потенциальная проблема заключается в том, что если он видит разрешение на выполнение в простом файле, он предполагает, что оно является преднамеренным, и сохраняет его, поэтому он не будет очищен после того, как кто-то пройдет и назначит разрешение на выполнение для всего.

Это то, что мой NAS устанавливает произвольные разрешения для новых файлов, и я хочу привести их в соответствие с тем, насколько я чувствую себя комфортно с разрешениями для файлов и каталогов. Спасибо за подробное объяснение. Я думаю, что первым было то, что я искал :) SebinNyshkim 7 лет назад 0

Похожие вопросы