전체 폴더를 소스에서 대상으로 복사하고 대상에서 중복 파일 또는 폴더를 삭제합니다.

전체 폴더를 소스에서 대상으로 복사하고 대상에서 중복 파일 또는 폴더를 삭제합니다.

/var/www/html/test/소스에서 대상으로 모든 파일과 디렉터리를 복사해야 합니다 /var/www/html/test2/. 소스에서 파일을 복사한 후 삭제해야 하는 추가 파일과 폴더가 대상에 이미 있을 수 있습니다.

복사하기 전에 대상의 모든 내용을 삭제할 수는 없습니다.

고쳐 쓰다

나는 다음을 시도했다:

cp1) 명령을 사용하여 소스에서 대상으로 파일 복사

cp -R source destination

잘 작동합니다.

2) 대상 파일의 모든 파일을 반복하여 파일이 소스에 존재하는지 확인했습니다. 파일이 대상에서 제거되지 않은 경우

for file in /var/www/html/test2/*; 
  do filestr=`basename $file`;echo $file; 
  if [ `ls /var/www/test1/ | grep -c $filestr` -eq 0 ]; 
 then rm $file; fi; 
done;

대상의 루트 파일에만 적용됩니다.

소스와 일치하는 경우 모든 파일과 디렉터리를 재귀적으로 확인하는 방법을 알아내야 합니다.

답변1

이것은 전형적인 사용 사례입니다 rsync. rsync디렉터리 트리가 소스에서 대상으로 복사됩니다. 중복된 항목을 삭제하도록 요청할 수도 있습니다.다른복사된 파일:

rsync -a -v --delete-after /var/www/html/test/ /var/www/html/test2  

/후행 소스 사양을 참고하세요. 이것을 생략하면 원하지 않는 소스 디렉터리 자체가 복사됩니다.

조용히 하고 싶으면 삭제하세요 -v. 파일이 크고 압축 가능한 경우 파일을 추가하여 -z압축하고 압축을 풀 수 있지만 그렇게 하면 많은 이점을 얻을 수 있을지 의문입니다. 이 --delete-after옵션은 대상에 있는 중복된 파일과 폴더만 삭제하지만 삭제하지는 않습니다.뒤쪽에다른 파일은 복사되었습니다.

사용의 이점은 rsync동일한 파일(즉, 이미 존재하고 실제로 일치하는 파일)을 복사하지 않아도 된다는 것입니다.

답변2

#!/bin/bash

SOURCE="/var/www/html/test/"
DESTINATION="/var/www/html/test2/"

cp -pRu "$SOURCE*" "$DESTINATION"

HITSDIR=`find $DESTINATION -type d | sed -e 's|'$DESTINATION'\(.*\)|\1|g'`

for i in $HITSDIR; do
if [ -e $SOURCE$i ]; then
echo Yes $SOURCE$i exists
else
echo Nope delete $DESTINATION$i.
#rm -r $DESTINATION$i
fi
done

HITSFILES=`find $DESTINATION -type f | sed -e 's|'$DESTINATION'\(.*\)|\1|g'`

for i in $HITSFILES; do
if [ -e $SOURCE$i ]; then
echo Yes $SOURCE$i exists
else
echo Nope delete $DESTINATION$i.
#rm $DESTINATION$i
fi
done

이렇게 하면 원하는 대로 작동할 것입니다. 시험 실행을 수행한 후 rm의 주석 처리를 제거하면 됩니다.

관련 정보