Я пытаюсь использовать 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 обрабатывает это.

2 ответа2

2

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

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

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

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

1

Вы можете использовать преимущества и / или структуру системы выражений 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", что означает «выполнить, но только если это имеет смысл». В основном это означает, что он устанавливает выполнение для каталогов, но не для простых файлов. Основная потенциальная проблема заключается в том, что если он видит разрешение на выполнение в простом файле, он предполагает, что оно является преднамеренным, и сохраняет его, поэтому он не будет очищен после того, как кто-то пройдет и назначит разрешение на выполнение для всего.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .