Архивируйте, присваивайте имена и перемещайте файлы в другую директорию с помощью bash-скрипта

#linux #bash #shell

#linux #bash #оболочка

Вопрос:

У меня есть входящий поток данных, который я хочу написать bash-скрипт для обработки по расписанию. Часть скрипта потребуется для получения новых файлов и их архивирования, как описано ниже:

  1. Найдите все файлы / вложенные папки в data.
  2. Заархивируйте эти файлы / вложенные папки и назовите zip по текущей дате.
  3. Переместите zip-файл в архив
  4. Удалите файлы / вложенные папки в 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 или что-то подобное, чтобы создавать резервные копии только новых файлов каталога.