Добавить исключения директорий в find
Есть команда, которая сохраняет права доступов к файлам и директориям linux в файл
find / -depth -exec stat --format '%a %u %g %n' {} + > /save-the-list
Необходимо добавить в исключения вот такой список директорий
dev/
proc/
sys/
run/
Подскажите плиз, как это можно сделать? Пробовал использовать с ключиком -prune , но как я понял из вывода, -prune не работает с -depth
Еще пробовал так
find / -depth \( -path /dev -o -path /run \) -exec stat --format '%a %u %g %n' {} + > /save-the-list
Но тоже не то..
Ответы (2 шт):
Самое простое, если в именах директорий в корне нет пробелов, то можно как-то так:
find $(ls / | grep -Ev '^(dev|proc|sys|run)$') -depth -exec stat ...
Если подзакладываться на пробелы, то можно что-то такое соорудить:
ls / | grep -Ev '^/(dev|proc|sys|run)$' | while read d; do find "$d" -depth -exec stat ... ; done
Менее эффективный вариант, но учитывающий пробелы (и переводы строк) и ограничивающийся одним find'ом:
find / -! \( -path '/dev/*' -o -path '/proc/*' ... \) -depth -exec stat ...
Для исключения каталога и его вложения из поиска и вывода программой find следует указывать параметры поиска -not -path '/path*', если нужно оставить каталог но исключить его содержимое, то указываем '/path/*', если нужно убрать каталог, но оставить содержимое, то указываем '/path'
Важно:
При исключении каталога и его содержимого '/path*' - дополнительно могут быть исключены каталоги по маске, т.е. если прописать /work*, то будут исключены /work /workdir /working и т.д.
Дополнительно, внешнюю программу stat можно не использовать, данные можно получить стандартным параметром -printf
Пример:
find / \
-not -path '/dev*' \
-not -path '/proc*' \
-not -path '/sys*' \
-not -path '/run*' \
-printf '%m %U %G %p\n'
Пример 2:
find / -not \( -path '/dev*' -o -path '/proc*' -o -path '/sys*' -o -path '/run*' \) -printf '%m %U %G %p\n'