지난 24시간 이내에 생성되었으며 특정 파일 형식(*.png)의 파일을 복사하는 스크립트를 작성하려고 합니다.
내가 시도한 명령은 다음과 같습니다.
rsync -avz --ignore-existing --include='*.png' --exclude='*' \
--files-from=<(ssh user@remote1 'find /home/admin/Backup/ -mtime -1 -type f -exec basename {} \;') \
user@remote1:/home/admin/Backup/ /Repository/
이는 백업 디렉터리의 *.png 파일에 대해 작동하지만 파일이 2~3개 폴더 깊이인 경우, 즉 백업 디렉터리 내에 있는 경우 명령이 실패합니다 /home/admin/Backup/folder1/folder2/
.
link_stat '/home/admin/Backup/example.png' failed: No such file or directory (2)
그 이유는 basename {}
결과를 반환할 때 해당 위치를 잘라내기 때문입니다 rsync
. 그래서 삭제하려고 하면 basename {}
다음과 같은 결과가 나타납니다.
link_stat '/home/admin/Backup/home/admin/Backup/folder1/folder2/example.png' failed: No such file or directory (2)
소스 디렉토리를 추가하는 것과 마찬가지로 rsync
수정 방법을 모르겠습니다. 이 문제를 해결하는 방법을 아는 사람이 있나요? 아니면 제가 원격 서버에서 이 파일을 잘못된 방식으로 가져오고 있는 것일까요?
답변1
man rsync
물론 --files-from
:
The filenames that are read from the FILE are all relative to
the source dir -- any leading slashes are removed and no ".."
references are allowed to go higher than the source dir.
따라서 다음을 기준으로 경로를 출력해 보십시오 find
.
rsync -avz ... --files-from=<(ssh user@remote1 'cd /home/admin/Backup/; find . -mtime -1 -type f -name "*.png")
또는 find /home/... ... -printf "%P\n"
, %P
이후암소 비슷한 일종의 영양find
예:
파일 이름과 파일이 발견된 명령줄 인수의 이름이 제거되었습니다.
-name "*.png"
필터링이 가능하고 이미 사용되고 있는데 왜 필터링을 수행해야 하는지 알 수 없기 때문에 자유롭게 추가했습니다 rsync
.find