폴더 구조를 유지하면서 마지막 날에 변경된 파일만 복사해 보세요.

폴더 구조를 유지하면서 마지막 날에 변경된 파일만 복사해 보세요.

최근에 수정된 파일을 찾아서 복사하려고 합니다. 이 작업을 수행하는 동안 그 안에 많은 하위 디렉터리와 데이터 파일이 유지되도록 노력합니다 dir1.dir1

지금까지 제가 정리한 내용은 다음과 같습니다. 그러나 mtime파일 내용이 업데이트되면 디렉토리의 내용은 업데이트되지 않습니다. 또한 나는 이 cp 명령이 변경된 파일뿐만 아니라 디렉토리의 모든 파일을 복사할 것이라고 믿습니다.

find /NAS/data/dir1 -type d -mtime -1 -exec cp -at /mnt/databackup/dir1 {} +

그것을 사용하면 -type f폴더 구조가 유지되지 않습니다.

답변1

find ... -type fbash for 루프와 함께 를 사용할 수 있습니다 . 루프에서 mkdir -p및 조합을 사용하면 dirnamecp를 사용하여 각 파일을 복사하기 전에 폴더 구조를 다시 만들 수 있습니다.

#!/bin/bash

dirA="/NAS/data/dir1/"
dirB="/mnt/databackup/dir1/"
while read -r file
do
    relative="${file##"$dirA"}"
    newfile="$dirB$relative"
    echo mkdir -p "$(dirname "$file")"
    echo cp -at "$file" "$newfile"
done < <(find "$dirA" -type f -mtime -1)
  • readbash 내장 기능입니다. 일반적으로 -r일부 극단적인 경우 문제를 방지하는 데 사용됩니다 . .txt 파일에서 한 번에 한 줄씩 읽습니다 stdin. 여기, 이것이 stdin출력입니다 find.
  • ${var##string-to-remove}형식이다매개변수 대체
  • newfile="$dirB$relative". 이것은 고전적인 bash 연결입니다.
  • $(). 이 bash 구성은 다음과 같습니다.명령 대체
  • mkdir -p필요에 따라 디렉토리와 모든 상위 항목을 만듭니다.
  • cmd < file이는 고전적인 리디렉션입니다.
  • <(cmd)이것은 ... 불리운다프로세스 교체. 파일 이름을 명령의 stdin[ >()] 또는 stdout[ ] 에 대한 핸들로 바꿉니다 <().

당신은 할 수explainshell.com을 이용하세요더 자세한 설명을 원하시면.

관련 정보