;
в конце команды, выполняемой от find
до -exec
, необходимо заключать в кавычки, чтобы защитить ее от оболочки. В противном случае оболочка увидит его как конец команды find
.
Изменить
find /var/production-backup/ -mtime +7 -exec rm -rf {} ;
-
find /var/production-backup/ -mtime +7 -exec rm -rf {} ';'
или на
find /var/production-backup/ -mtime +7 -exec rm -rf {} \;
или просто
find /var/production-backup/ -mtime +7 -delete
, если ваш find
поддерживает это.
Также обратите внимание, что ваша команда find
не делает различий между каталогами, файлами или другими вещами в /var/production-backup
. Если, например, сам каталог /var/production-backup
не изменялся более семи дней (, потому что в нем не было создано/удалено файлов или каталогов ), то вся эта файловая иерархия будет удалена.
Если вы собираетесь удалять только обычные файлы, используйте
find /var/production-backup/ -type f -mtime +7 -delete
Связанные:
Другие примечания к вашему коду:
Если да
TAR=$(which tar)
и более позднее использование
$TAR...
для создания tar
архива,тогда вы можете также использовать tar
напрямую. Нет смысла устанавливать TAR
на путь к двоичному файлу tar
с which
, так как это приведет к поиску PATH
точно так же, как использование tar
напрямую. То же самое касается и других команд, которые вы храните в переменных.
Проверка [ `$MKDIR -p "$PRODBACKDIR"` ]
должна быть проверкой непосредственно состояния возврата mkdir
. Утилита mkdir
не выдает вывод, который можно протестировать. Вам также не нужно проверять наличие каталога перед использованиемmkdir -p
:
if mkdir -p "$PRODBACKDIR"; then
echo 'Directory Created for site'
fi
Также обратите внимание, что вы используете {$PRODBACKDIR}
, что добавит {
и }
к пути к каталогу. Поскольку это делается в бесполезном тесте каталога, никакого вреда не было (тест всегда терпел неудачу ). Вам также не нужно echo -e
здесь.
Вам не нужно {}
вокруг имен переменных в расширениях переменных. Единственное место, где вам нужно написать ${variable}
, — это когда расширение является частью строки, где следующий за ним символ является допустимым символом в имени переменной, как в "${variable}x"
. Однако вам нужно заключать в двойные кавычки все раскрытия переменных.
Параметр --progress
для rsync
записывается с двумя дефисами, а не с одним. Кроме того, -e ssh
, насколько мне известно, используется по умолчанию для rsync
с давних пор.
Линия
FILENAME=$(echo $DOC | awk -F '/' '{print $NF}');
может быть записано с использованием стандартной замены параметра как
FILENAME=${DOC##*/}
Вам очень редко приходится тестировать против $?
. Например, вместо
tar...
if [ $? -eq 0 ]; then...
сделать
if tar...; then...
Также рассмотрите возможность использования printf
для вывода переменных данных.
Вы определяете TODAY_DATE
как строку, содержащую сегодняшнюю дату, но используете ее только дважды. Однако есть как минимум три других вызова date
с немного другим форматом... (также, %Y-%m-%d
можно заменить на %F
, см.man strftime
).
Вам не нужно ;
в конце команд, за которыми сразу не следуют другие команды в той же строке. Новая строка работает как терминатор команды.
И т. д.,...
Я бы также посоветовал изучить существующее программное обеспечение для резервного копирования. Я мог бы порекомендовать, например, borgbackup
и restic
.
Связанные:
Судя по этим сообщениям об ошибках, это ограничение 7 -Zip:
Пока я буду использовать tar -xzf test.tgz
для извлечения файлов.
На справочной странице 7z упоминается, что для систем Unix разрешения не сохраняются в 7 -Zip:
Backup and limitations DO NOT USE the 7-zip format for backup purpose on Linux/Unix because : - 7-zip does not store the owner/group of the file. On Linux/Unix, in order to backup directories you must use tar :
- to backup a directory : tar cf - directory | 7za a -si directory.tar.7z
- to restore your backup : 7za x -so directory.tar.7z | tar xf -
If you want to send files and directories (not the owner of file) to others Unix/MacOS/Windows users, you can use the 7-zip format.
example : 7za a directory.7z directory
Do not use "-r" because this flag does not do what you think.
Do not use directory/* because of "." files (example : "directory/" does not match "directory/.profile")
Таким образом, вы должны иметь возможность сохранять статусы разрешений и владельцев, используя его в сочетании с TAR.