У меня есть резервная папка, которая доступна с помощью sftp. Идея заключается в том, что резервная копия поступает в эту папку, но не должна там оставаться. Я хочу переместить их с помощью cron. Это уже возможно, но, поскольку я не могу быть уверен, что имя файла является уникальным, я хотел бы указать префикс файла при его перемещении.

* * * * * find /src/backup/ -mmin +60 -exec mv "{}" /dest/backup/ \;

Как я могу изменить команду таким образом, чтобы эфир сам файл получил префикс
например, yyyymmdd-MMSS- или что используется новая папка, например, yyyymmdd?

2 ответа2

1

Для этого вам потребуется сценарий, поэтому вы не можете сделать это напрямую с опцией -exec (если вы не используете bash -c , что затрудняет цитирование и расширение параметров).

Есть два варианта:

  • Используйте find /src/backup/ | while read -r f; do ...; done - это будет работать, если у вас есть нормальные имена файлов (без начальных / конечных пробелов или встроенных новых строк).
  • Вызовите файл сценария с нужными вам командами, например, find /src/backup/ -mmin +60 -exec /Path/To/moveunique {} /dest/backup/ - в этом случае я рекомендую указать полный путь к сценарию в Линия crontab , так как ее окружение отличается от вашей интерактивной оболочки.

Я проиллюстрирую первый вариант: должно быть очевидно, как использовать подобные команды в файле сценария:

find /src/backup/ | while read -r f; do \
    mv "$f" /dest/backup/"${f%/*}"/$(date -d@$(stat "$f" -c %Y) +'%Y%m%d-%H%M')-"${f##*/}"; \
done

Он использует stat для получения времени модификации файла, date для форматирования нужных вам полей времени и расширения параметра для разделения пути и имени каталога файла.

Это делает довольно длинную командную строку (я использовал строки продолжения, чтобы сделать ее более читабельной, и я не проверял, поддерживает ли crontab это), поэтому вы предпочитаете использовать скрипт.

0

Так как мне нужна некоторая гибкость, я придумал версию сценария, основанную на идее AFH.

#!/bin/sh

# configure: source path
source_path="/src/path/backup";

# configure: destination path
destination_path="/dest/path/backup";

# find all files in source_path not modified in the last 60 minutes
find $source_path -mmin +60 -type f | while read -r file; do

    # this is the absolute source path (/src/path/backup/path/to/file)
    absolute_source_path="${file%/*}";

    # get the relative source path (/path/to/file)
    relative_source_path=${absolute_source_path#$source_path}

    # get the last modification date of the file (yyyymmdd)
    file_save_date="$(date -d@$(stat "$file" -c %Y) +'%Y%m%d')";

    # IMPORTANT create sub directory at the destination if required
    mkdir --parents "$destination_path/$file_save_date$relative_source_path/";

    # move the file to new destination (/dest/path/backup/yyyymmdd/path/to/file)
    mv "$file" "$destination_path/$file_save_date$relative_source_path/" > /dev/null 2>&1;

done

# delete empty folders if the the folder is not changes in the last 5 minutes
find $source_path/* -mmin +5 -type d -empty -delete > /dev/null 2>&1;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .