Перемещение файлов старше одного года в родительский архивный каталог

Перемещение файлов старше одного года в родительский архивный каталог

Я хочу переместить фотографии из моей коллекции в каталог «/home/Bruno/Archiv/Bilder», который является родительским для каталога «/home/Bruno/Bilder».

Я начал с:

find  -ctime +365 -exec echo mv '{}' ../Archiv/Bilder/'{}' \; | bash

Но find включает точку для текущего каталога в {}. Поэтому я получаю:

mv ./2013/01/19/DSC_0141.JPG ../Archiv/Bilder/./2013/01/19/DSC_0141.JPG
mv: das Verschieben von »./2013/01/23/IMG_0052.JPG“ nach »../Archiv/Bilder/./2013/01/23/IMG_0052.JPG“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

Поэтому я убрал точку с использованием sed:

find  -ctime +577 -exec echo mv '{}' ../Archiv/Bilder/'{}' \;  | sed 's/\/Bilder\/\.\//\/Bilder\//' | bash

Но я получаю ту же ошибку:

mv: das Verschieben von »./2013/01/10/IMG_0141.JPG“ nach »../Archiv/Bilder/2013/01/10/IMG_0141.JPG“ ist nicht möglich: Datei oder Verzeichnis nicht gefunden

Поэтому я решил переключиться на rsync, чтобы выполнить эту работу:

find  -ctime +577 -exec echo rsync -n --remove-source-files '{}' ../Archiv/Bilder/'{}' \;  | sed 's/\/Bilder\/\.\//\/Bilder\//' | bash

И rsync терпит неудачу, но об этом написано гораздо подробнее:

rsync: change_dir#3 "/home/Bruno/Bilder//../Archiv/Bilder/2013/01/10" failed: No such file or directory (2)
rsync error: errors selecting input/output files, dirs (code 3) at main.c(712) [Receiver=3.1.0]

Что я здесь делаю не так?

решение1

Ваша команда find сталкивается с проблемой, что промежуточные каталоги (в данном случае /home/Bruno/Archiv/Bilder/2013/01/23/) еще не созданы. Это не имеет ничего общего с (безобидным) ' .' в вашем пути.

Вам придется либо сначала создать всю структуру каталогов для цели, либо создать небольшой скрипт, который вы вызовете вместо mvэтого и который сначала создаст целевой каталог, а затем выполнит перемещение.

mkdirmv:

#!/bin/sh
mkdir -p -- "$(dirname $2)"
mv -- "$1" "$2"

решение2

Для справки в будущем - вы можете использовать, installчтобы сделать это напрямую:

install -D ./2013/01/10/IMG_0141.JPG ../Archiv/Bilder/2013/01/10/IMG_0141.JPG

Примечание: вам нужно добавить путь к файлу во второй аргумент, чтобы это сработало. Другими словами:

Неправильно:

find . -ctime +365 -exec install -D '{}' ../Archiv/Bilder/ \;

Правильный:

find . -ctime +365 -exec install -D '{}' '../Archiv/Bilder/{}' \;

Согласно странице руководства install:

-D создать все ведущие компоненты DEST, кроме последнего, затем скопировать SOURCE в DEST

Связанный контент