/var/www/html/test/
소스에서 대상으로 모든 파일과 디렉터리를 복사해야 합니다 /var/www/html/test2/
. 소스에서 파일을 복사한 후 삭제해야 하는 추가 파일과 폴더가 대상에 이미 있을 수 있습니다.
복사하기 전에 대상의 모든 내용을 삭제할 수는 없습니다.
고쳐 쓰다
나는 다음을 시도했다:
cp
1) 명령을 사용하여 소스에서 대상으로 파일 복사
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의 주석 처리를 제거하면 됩니다.