
Я хочу переместить фотографии из моей коллекции в каталог «/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