Можно использовать команду находки для создания входного списка для большинства версий tar.
В зависимости от разновидности Unix, использующий синтаксис команды можно отличаться. Например, на IBM AIX это было бы что-то вроде этого:
$ cd /directory/you/want/to/archive
$ find . \( -name '*.php' -o \
-name '*.txt' -o \
-name '*.inc' -o \
-name '*.js' -o \
-name '*.css' -o \
-name '*.php3' \) -print > /tmp/input.list
$ tar -c -L/tmp/input.list -f - | gzip -c > /path/to/backup.tar.gz
Если у Вас есть необычный GNU (/Linux) utils, можно сделать:
$ cd /directory/you/want/to/archive
$ find . -regex '.*\.\(php\|txt\|inc\|js\|css\|php3\)' -print > /tmp/input.list
$ tar -c -z -T /tmp/input.list -f /path/to/backup.tar.gz
Ваша линия выполняет три вызова для каждого файла; достаточно одного stat
+ синтаксического анализа вывода. Для начала измените свой скрипт так, чтобы он вызывал stat
только один раз с помощью stat -c "% n% G% A"
... если вам нужна помощь с этим, напишите нам комментарий.
Самым быстрым решением, которое я нашел за последний час, было:
failed=$(find -L . -printf "%p %g %M\n" | awk '{ if ($2 != "XYZ"){ printf $1; exit 1 }; if ( substr( $3, 9, 1 ) != "-" ) { printf $1; exit 2 } }')
ret=$?
test ! $ret -eq 0 && echo "Error with file $failed"
, которое в качестве примера проверяет владельца группы и права доступа. Эта версия, использующая только поиск, но не статистику, и переход по символическим ссылкам как минимум в 100 раз быстрее.