Скрипт для перемещения файлов старше 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включить подробный режим и информацию о прогрессе.