예를 들어 폴더가 있습니다.
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
- F21
및 F12
는 F22
동일합니다.
폴더에는 F21
, 에 비해 파일 F22
수가 적습니다 F11
.F12
F2
반복적 으로 복사해야 F1
하지만 교체될 파일은 백업 폴더에 저장해야 합니다.
Fbackup\F11\those files..
Fbackup\F12\those files..
이는 해당 복사본의 "실행 취소" 작업을 수행하는 데 필요합니다. 예를 들어 Fbackup을 복사한 것보다 재귀적 F2
으로 복사했는데 원본이 .F1
F1
F1
답변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
대신 사용해야 합니다 . 해당 솔루션의 모습은 다음과 같습니다. (저는 전문가가 아니기 때문에 개선이 가능할 수도 있습니다.)...
F2
bash
먼저 스크립트를 작성하고 호출하십시오 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 {}"