Скрипт для перемещения файлов старше 5 дней

В настоящее время я работаю над сценарием, который позволяет мне переместить любой файл старше 5 дней в архивную папку с тем же путем, за исключением корневой папки, которая изменяется. Так что-то вроде:root/subdir1/subdir2/file в rootarchive/subdir1/subdir2/file, Это должно работать рекурсивно.

Я уже пытался создать foreach для всех файлов в корневой папке:

#!/bin/bash
find . -type f -name '*.*' -print0 | while IFS= read -r -d '' file; do
      mv $file ../rootarchive/"$file"
done

Но это не работает должным образом, так как я команда mv не может найти указанный пункт назначения ../rootarchive/"$file", Кто-нибудь из вас знает, как я могу решить эту проблему?

1 ответ

Решение

Вам нужно создать дерево каталогов из subdir1/subdir2/ - mv не сделаю это для вас. Вы могли бы сделать, например:

find . -type f -mtime +5 -print0 | while IFS= read -r -d '' file; do
    dir="${file%/*}"
    mkdir -p ../rootarchive/"$dir"
    mv "$file" ../rootarchive/"$file"
done

Вы могли бы rsync, Он может воссоздать структуру каталогов и удалить скопированные файлы:

find . -type f -mtime +5 -print0 | 
  rsync -0avP  --remove-source-files --files-from=- ./ ../rootarchive

За rsync:

  • -0 указывает на то, что списки файлов разделены нулями. Это влияет на:
  • --files-from= читает список файлов для копирования (из stdin: -).
  • -a включает режим архива, который сохраняет права доступа к файлу, владельца и т. д.
  • --remove-source-files удаляет файлы, которые были успешно скопированы из источника.
  • -vP включить подробный режим и информацию о прогрессе.
Другие вопросы по тегам