두 디렉터리를 복사/병합하고 두 파일의 이름이 같은 경우 이전 디렉터리의 이름을 바꾸고 수정 시간을 추가하는 방법

두 디렉터리를 복사/병합하고 두 파일의 이름이 같은 경우 이전 디렉터리의 이름을 바꾸고 수정 시간을 추가하는 방법

대부분 이름은 같지만 다를 수 있는 파일이 포함된 여러 디렉터리가 있으며 이러한 디렉터리를 모두 새 디렉터리로 병합해야 합니다. 동일한 이름의 파일을 비교하고 동일한 경우 무시/덮어쓰거나, 다른 경우 수정된 날짜/시간을 파일 이름에 추가하여 이전 파일을 이동/이름을 바꿀 수 있어야 합니다.

자세한 내용과 @Serhat Cevikel 및 @Wildcard 주소를 추가하려면: 데이터는 유사한 구조를 가진 두 개의 드라이브에 저장되며 고려해야 할 하위 폴더가 있기 때문에 약간 복잡합니다. 다음은 제가 만든 테스트 환경의 트리와 몇 가지 설명입니다.

/bmrlbackup/drive1/
`-- user001
    `-- directory1
        `-- project001
            |-- file000           #identical
            |-- file001           #older same name
            |-- file0011          #unique
            |-- phase1
            |   |-- file000       #identical
            |   |-- file110       #unique
            |   |-- file999       #newer same name
            |   `-- phase11
            |       `-- file111   #unique
            `-- phase2
                `-- file120       #unique
/bmrlbackup/drive2/
`-- user002
    `-- directory2
        `-- project001
            |-- file000           #identical
            |-- file001           #newer same name
            |-- file0012          #unique
            |-- phase1
            |   |-- file000       #identical
            |   |-- file210       #unique
            |   `-- file999       #older same name
            `-- phase2
                |-- file220       #unique
                `-- phase21
                    `-- file221   #unique

첫 번째 rsync의 출력:

#rsync -a --ignore-existing --remove-source-files $sd1/ $dd1/
project001/
project001/file0011
project001/phase1/
project001/phase1/file110
project001/phase1/phase11/
project001/phase1/phase11/file111
project001/phase2/
project001/phase2/file120

하위 디렉터리를 나열하도록 remm(나머지 "동일" 파일)을 변경했습니다.

#remm=`ls -1 $(find $sd1/ -type f)`
/bmrlbackup/drive1/user001/directory1/project001/file000
/bmrlbackup/drive1/user001/directory1/project001/file001
/bmrlbackup/drive1/user001/directory1/project001/phase1/file000
/bmrlbackup/drive1/user001/directory1/project001/phase1/file999

여기에 두 개의 파일이 있습니다.

/bmrlbackup/drive1/user001/directory1/project001/file000 
/bmrlbackup/drive1/user001/directory1/project001/phase1/file000

두 위치 모두 동일하므로 복사할 필요가 없으며 이동하여 대상을 덮어쓸 수 있습니다.

이름은 같지만 내용이 다른 파일:

/bmrlbackup/drive1/user001/directory1/project001/file001
/bmrlbackup/drive1/user001/directory1/project001/phase1/file999

"이름은 같지만 콘텐츠가 다릅니다" 파일을 비교해야 하며, 이전 파일의 이름을 바꿔야 합니다. 수정 날짜와 시간을 추가해야 합니다. 따라서 소스가 최신이면 대상 파일의 이름을 추가하고 소스가 오래된 경우 소스를 이동합니다. 그런 다음 소스 이름을 추가하고 추가 소스 이름을 이동합니다.

이 프로세스의 결과로 결국 모든 파일이 드라이브 1에서 드라이브 2로 이동됩니다.

그런 다음 가장 오래된=`{$sd1,$dd1}에 대한 모든 오류를 찾습니다...

제안?

각 드라이브에는 4k에서 800M 크기의 파일이 10,000개 이하로 제한됩니다.

답변1

제 기억이 맞다면 파일 이름이 다르면 파일을 mv하고, 파일 이름이 같으면 이전 파일의 이름을 바꾸고 모드 날짜/시간을 추가한 다음 mv를 추가하라는 뜻입니다. 스크립트는 다음과 같습니다. 첫 번째 매개변수는 소스 경로이고 두 번째 매개변수는 대상 경로입니다. 경로 끝에 슬래시를 추가하면 안 됩니다.

(업데이트: "ls"는 "find"로 대체되었습니다. 이는 ls를 구문 분석하지 않고 여러 경로에 있는 파일을 날짜별로 정렬하는 두 가지 목적을 제공합니다. 변수 대체 자체가 더 간결해졌습니다. 와일드카드와 공백 및 ":"는 모두 공백으로 대체)

#!/bin/bash

sd1=$1
dd1=$2


rsync -a --ignore-existing --remove-source-files $sd1/ $dd1/
remm=`ls $sd1`

for i in $remm
do
    oldest=`find {$sd1,$dd1} -type f -name $i -printf "%T@ %p\n" | sort -n | head -1 | cut -d " " -f2`
    appendd=`stat $oldest --printf=%y\n | sed 's/ +.*//g' | sed 's/[ :]/_/g'`
    newname="${oldest}_$appendd"
    mv $oldest $newname
done

rsync -a --ignore-existing --remove-source-files $sd1/ $dd1/

관련 정보