LINUX.ORG.RU

Перемещение файлов со структурой

 ,


0

1

Подскажите пожалуйста как переместить файлы старше N дней с сохранением структуры каталогов.

Т.е. как правильно обработать результат команды find:

find /volume1/Доки -type f -mtime +90 -print

надо переместить все найденные файлы в /volume1/АрхивДоков

В принципе годится как вариант с удалением папок источника (если они оказались пустыми), так и без удаления папок.

Вот так:

find /volume1/Доки -type f -mtime +90 -print -exec --parents -Rv {} /volume1/АрхивДоков

не получается. т.к внутри АрхивДоков создается volume1/Доки

Да и как удалить именно!! найденные сейчас файлы. Т.к. операция длительная и начинает работу вечером то может удалиться то что не было перенесено в архив, если попадет лишний день.

find /volume1/Доки -type f -mtime +90 -print -exec --parents -Rv {} /volume1/АрхивДоков

Тут, что, команда ″cp″ пропущена?

Да и как удалить именно!! найденные сейчас файлы. Т.к. операция длительная и начинает работу вечером то может удалиться то что не было перенесено в архив, если попадет лишний день.

Не распарсил. Переместить или удалить? Если у вас «перещение» это копиование с помощью ″cp″, ну делайте тогда в ″find″ два ″-exec″, один с ″cp″, другой с ″rm -f″.

Или пишите скрипт, который из имени файла будет убирать ″volume1/Доки″, потом из этого выделять имя каталога, делать ″mkdir -p″, а потом mv. И из find вызывайте этот скрипт.

mky ★★★★★ ()

структура == каталоги. перемещай их

anonymous ()
Ответ на: комментарий от mky

Mky

1. да cp пропустил при наборе. У mv не нашел опции перемещения со структурой каталогов.

2. Не знал что exec можно дважды использовать.

А что конкретно написать надо подскажете? Неужели нельзя относительные пути как то получить?

Может вообще как то по другому можно сделать? В винде ведь просто:

robocopy c:\1 c:\2 /s /MOV /MINAGE:90

Anonymous

Я не могу перемещать каталоги. В них же остаются файлы измененные после даты -mtime.

chainik2015 ()
Ответ на: комментарий от chainik2015

Неужели нельзя относительные пути как то получить?

можно сначала перейти в директорию /volume1/Доки, а потом делать find .

можно получать относительный путь откусыванием известного префикса от абсолютного

anonymous ()
Ответ на: комментарий от chainik2015

Про то, что нужно запускать не:

find /volume1/Доки -type ...
a
cd find /volume1/Доки && find . -type ...
уже написали.

Полного аналога robocopy нет, так что только скрещивать find с ″cp″ или ″rsync″ или самописным скриптом, вызывающим ″mkdir″ и ″mv″.

″rsync″ сам может удалять файлы.

В случае с ″find″ + ″cp″ нужно после ″-exec cp ...(аргументы cp)″ написать ″\; -delete″.
Точка с запятой закончит список аргументов ″cp″, а ″-delete″ это выражение команды ″find″. Она выполняет по порядку все выражения, точнее не попорядку, а с условием .AND., то есть если ″-exec″ завершится неудачно, ″-delete″ не будет выполнятся.

mky ★★★★★ ()
Ответ на: комментарий от mky

MKY Спасибо большое. На synology линукс какой-то обрезанный, многие параметры у find не поддерживаются (например "-empty"), но "-delete" вроде бы есть.

chainik2015 ()
Ответ на: комментарий от mky

А через xargs как-то это сделать можно? 2 xargs или 2 команды в xargs последовательно как-то прилепить вариант? Что-то вроде:

find -type f -mtime +90 -print0 | xargs -0 cp --parents -Rpv -i {} /volume1/АрхивДоков\; | xargs rm -f {} \;

Т.е. можно так: founddata=`find . -type f -mtime +90 -print0`

echo «$founddata» | xargs 0 cp --parents -Rpv -i {} /volume1/АрхивДоков

echo «$founddata» | xargs rm -f {}

Но как при этом обеспечить неразрывность действия с файлом, т.е. если не скопировался, то и не удаляем?

chainik2015 ()
Ответ на: комментарий от chainik2015

Но как при этом обеспечить неразрывность действия с файлом, т.е. если не скопировался, то и не удаляем?

Никак. И точно так же не получится целостность в случает двух xargs.

Для того, чтобы делать cp && rm нужно, чтобы cp копировал 1 файл.

У вас там какой объём файлов, что возникла необходимость в xargs?

Как вариант можно паковать файлы в архив (tar умеет удалять), а потом распаковывать их.

Если /volume1/Доки и /volume1/АрхивДоков на одной файловой системе и она unix'ова, то можно попробовать дать ″cp″ опцию ″-l″, тогда вместо копирования будут создаваться hardlink'и. Потом пройти ″find -link 2 -delete″. Это при условии, что другие скрипты не создают hardlink'и на /volume1/Доки.

Если доки и архив на разных ФС, то можно создать на одной ФС с volume1 каталог с именем АрхивДоков (допустим /volume1/TEMP/АрхивДоков) «скопировать» туда файлы с помощью ″cp -l″, потом делать ″mv /volume1/TEMP /volume1″.

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.