#linux #bash #shell
#linux #bash #оболочка
Вопрос:
У меня есть входящий поток данных, который я хочу написать bash-скрипт для обработки по расписанию. Часть скрипта потребуется для получения новых файлов и их архивирования, как описано ниже:
- Найдите все файлы / вложенные папки в data.
- Заархивируйте эти файлы / вложенные папки и назовите zip по текущей дате.
- Переместите zip-файл в архив
- Удалите файлы / вложенные папки в data
Думая примерно так…
#!/bin/bash
client=name
data=/path/to/$client/data
archive=/path/to/archive/$client
if [ -z "$(ls -A $data)" ]; then
echo "No data to archive"
elif [ -n "$data" ]; then
echo "Archiving data"
find $data -print | zip -j "$(date "%m-%d-%Y@%T")".zip -@
mv "$(date "%m-%d-%Y@%T")".zip $archive
rm -vrf "${data:?}/"*
echo "Archive complete"
else
echo "Archive failure. The Slayer rejects your code."
fi
Я приближаюсь?
Комментарии:
1. Почему вы хотите найти все файлы и подкаталоги в каталоге для zip? Почему бы не заархивировать весь каталог?
2. Каталог — это место для удаления по FTP, и мне действительно нужно только ежедневно архивировать и перемещать содержимое каталога. Я не эксперт, поэтому открыт для предложений!
3. Я обновил исходный код. Цель — заархивировать содержимое данных, mv в архив, пустые данные. Какие-либо недостатки или проблемы с тем, как я это настроил?
4.
Am I getting close?
Прошло больше недели, и вы, вероятно, уже закончили.
Ответ №1:
Нет, ваш код не работает, потому что find «$data» -print напечатает $data, который представляет собой список файлов. Кроме того, он перезапишет все zip-файлы, потому что все они имеют одинаковое имя (например 2021-01-22.zip )
У вас есть несколько вариантов, если вы хотите заархивировать всю папку и переместить этот zip-файл в другой каталог:
zip -r $(date "%d-%m-%Y").zip /path/to/directory-1/
mv $(date "%d-%m-%Y").zip /path/to/directory-2
Если вы хотите заархивировать каждый файл отдельным:
#!/bin/bash
data=$(find /path/to/directory-1)
archive=/path/to/directory-2
if [ -z "$data" ]; then
echo "No data to archive"
elif [ -n "$data" ]
then
echo "Archiving data"
for i in $data; do
f=${i////_}
zip "$(date "%d-%m-%Y")_$f.zip" $i
mv $(date "%d-%m-%Y")_$f.zip $archive
done
echo "Archive complete"
else
echo "Error"
fi
Я заменил /path/of/file на path_of_file, потому что в противном случае вы не сможете создать файл с символами «/».
Как бы то ни было, я предлагаю вам использовать rsync или что-то подобное, чтобы создавать резервные копии только новых файлов каталога.