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