Найти каталоги и файлы с разрешениями, отличными от 775/664

21

Я перемещаю веб-сайт с одного сервера на другой, и Git не хранит метаданные, такие как права доступа к файлам. Мне нужно найти каталоги и файлы, которые не 775/664 соответственно.

Прямо сейчас я использую это мощёное устройство:

$ find . -type d -exec ls -la {} \; | grep ^d | grep -v ^drwxrwxr-x
$ find . -type f -exec ls -la {} \; | grep -v ^d | grep -v ^-rw-rw-r-- | grep -v '.git'

Хотя это работает, я чувствую, что это довольно глупо. Есть ли лучший способ сделать это, возможно, канонический, или я должен быть просто хакером?

Это работает в последней версии Ubuntu с инструментами GNU под Bash.

dotancohen
источник

Ответы:

39

Используйте -permтест findв сочетании с -not:

find -type d -not -perm 775 -o -type f -not -perm 664
  • -perm 775соответствует всем файлам с разрешениями, точно равными 775. -perm 664делает то же самое для 664.
  • -not (boolean NOT) отменяет следующий тест, поэтому он точно соответствует противоположному тому, что он имел бы: в этом случае все файлы, которые не имеют правильных разрешений.
  • -o(логическое ИЛИ) объединяет два набора тестов вместе, совпадая, когда один из них делает: он имеет самый низкий приоритет, поэтому он делит наши тесты на две отдельные группы. Вы также можете использовать скобки, чтобы быть более явным. Здесь мы сопоставляем каталоги с разрешениями, которых нет, 775и обычные файлы с разрешениями, которых нет 664.

Если вам нужны две отдельные команды для каталогов и файлов, просто разделите их пополам -oи используйте каждую половину отдельно.

Майкл Гомер
источник
Красиво спасибо! Я не знал, что можно установить два разных условия (например, тип -d и тип -f), и не знал о -perm.
Dotancohen
Может быть, обратите внимание, что -notэто не стандарт POSIX; они используют !вместо этого.
user1404316
2

Я понятия не имею, чего пытался достичь ваш код. Обычно причина поиска файлов и каталогов с неправильными разрешениями заключается в их изменении.

Так что это то, что я успешно использую в Ubuntu 16.04

find \! -perm 775 -type d -exec chmod 775 {} \;
find \! -perm 664 -type f -exec chmod 664 {} \;

Это демонстрирует! символ сбежал

NZ Dev
источник
На самом деле цель состояла не в том, чтобы изменить права доступа к файлам, а в том, чтобы определить, каким файлам требуются разрешения в виде снежинки при загрузке их на рабочий веб-сервер. Спасибо.
Dotancohen