1년이 지난 파일을 상위 아카이브 디렉터리로 이동

1년이 지난 파일을 상위 아카이브 디렉터리로 이동

내 컬렉션 사진을 "/home/Bruno/Bilder" 디렉토리의 상위 디렉토리인 "/home/Bruno/Archiv/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에 복사합니다.

관련 정보