원본을 다른 폴더에 보관하는 파일을 복사하는 배치 파일

원본을 다른 폴더에 보관하는 파일을 복사하는 배치 파일

예를 들어 폴더가 있습니다.

F1\F11\some files...
F1\F12\some files...
F1\F12\F121\some files..

그리고 또 다른 구조가 있어요

F2\F21\some files...
F2\F22\some files...
F2\F22\folder\some files...

폴더 이름 F11- F21F12F22동일합니다.

폴더에는 F21, 에 비해 파일 F22수가 적습니다 F11.F12

F2반복적 으로 복사해야 F1하지만 교체될 파일은 백업 폴더에 저장해야 합니다.

Fbackup\F11\those files..
Fbackup\F12\those files..

이는 해당 복사본의 "실행 취소" 작업을 수행하는 데 필요합니다. 예를 들어 Fbackup을 복사한 것보다 재귀적 F2으로 복사했는데 원본이 .F1F1F1

답변1

Unix 셸 사용에 열려 있는 경우 bash또는 내 고유의 C 셸을 사용하는 몇 가지 대안이 있습니다.

C 쉘 솔루션

다음과 같이 할 수 있습니다.해밀턴 C 쉘, 포함하는무료 버전:

cd F2
foreach i (...\*)
   if ( -f $i ) then
      if ( -e F1\$i ) cp F1\$i Fbackup\$i
      cp $i F1\$i
   end
end

표기법 ...무기한 디렉토리 와일드카드패턴의 나머지 부분을 일치시키는 데 무엇이 필요하든 0개 이상의 디렉터리 수준과 일치합니다. 디렉터리 트리 ...\*의 모든 파일이나 디렉터리와 일치합니다 F2. 그만큼-e운영자존재 여부를 테스트하고 -f운영자는 파일을 테스트합니다.

이 코드 단편에서는 관심 있는 숨겨진 파일이나 디렉터리가 없다고 가정합니다. 또한 F2(모든 파일은 아니더라도) 의 모든 디렉토리가 F1및 에 이미 존재한다고 가정합니다 Fbackup.

숨겨진 파일과 누락된 디렉터리를 고려해야 하는 경우 해결책은 다음과 같습니다. nonohidden = 1그리고mkdir누락된 디렉터리:

cd F2
@ nonohidden = 1
foreach i (...\*)
   if ( -f $i ) then
      if ( -e F1\$i ) then
         if ( ! -e Fbackup\$i:h ) mkdir -r Fbackup\$i:h
         cp F1\$i Fbackup\$i
      end
      if ( ! -e F1\$i:h ) mkdir -r F1\$i:h
      cp $i F1\$i
   end
end

bash해결책

너가 선호한다면시그윈 bash, 디렉터리 를 트리워크하려면 와일드카드 find대신 사용해야 합니다 . 해당 솔루션의 모습은 다음과 같습니다. (저는 전문가가 아니기 때문에 개선이 가능할 수도 있습니다.)...F2bash

먼저 스크립트를 작성하고 호출하십시오 backupscript.sh.

#!/usr/bin/bash
if [ -f "$@" ]; then
   if [ -e F1/"$@" ]; then
      cp F1/"$@" Fbackup/"$@"
   fi
   head=$(dirname "$@")
   if [ ! -e F1/"$head" ]; then
      mkdir -p F1/"$head"
   fi
   cp "$@" F1/"$@"
end

그런 다음 다음과 같이 실행하십시오.

cd F2
find . -type f  | xargs -I "{}" bash -c "backupscript.sh {}"

관련 정보