백업 스크립트를 만들려고 합니다. 저는 이 스크립트를 CentOS 6.7 시스템에서 작동하게 만들었고 이제 Debian 7에서 작동하게 하려고 합니다.
Google이나 이 사이트에서 찾을 수 있는 정보를 통해 해결할 수 없는 문제에 직면했습니다.이 문제를 논의하기 전에 내 상황을 설명하려고 노력하겠습니다.
CentOS에서는 지난 24시간 동안 변경된 파일을 찾아 다음 명령을 사용 $SOURCEDIR
하여 .xargs
$ARCHIVE
find $SOURCEDIR -mtime -1 -print | xargs -r tar rcvf $ARCHIVE || { echo "No files have been changed in the past 24 hours. Exiting script ..." ; exit 1; }
tar rcvf
다음을 사용하여 다음 오류 메시지가 호출될 수 있다는 것을 알고 있습니다 .
"-Acdtrux" 또는 "--test-label" 옵션을 여러 개 지정할 수 없습니다.
그러나 CentOS 시스템에서는 이런 일이 발생하지 않는 것 같습니다. 그것하다Debian 시스템에서는 명령줄에서 r
해당 명령을 제거 했습니다 tar
. 처음에 이것을 추가한 이유는 find
100개 이상의 결과가 반환될 때 아카이브를 덮어쓰는 것을 방지하고 싶었기 때문입니다.
이제 실질적인 문제로 넘어갑니다.내가 달릴 때마다
find $SOURCEDIR -mtime -1 -print
$SOURCEDIR
예상한 대로 지난 24시간 동안 변경된 파일 목록이 표시됩니다. 그러나 xargs
파이프 기호와 다음과 같은 전체 명령을 실행할 때마다 :
find $SOURCEDIR -mtime -1 -print | xargs -r tar cvf $ARCHIVE || { echo "No files have been changed in the past 24 hours. Exiting script ..." ; exit 1; }
find
실제로 명령이 인쇄되는 것을 보았습니다.모두파일은 $SOURCEDIR
다음을 포함하는 아카이브를 가져오는 것에서 나옵니다.모두파일에서 $SOURCEDIR
이유를 이해할 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다.
답변1
다른 사람들이 지적했듯이 명령의 문제점은 해당 명령에 디렉토리가 포함되어 있고 tar가 해당 디렉토리를 재귀적으로 보관한다는 것입니다. 디렉터리가 최근에 수정된 경우 수정 여부에 관계없이 해당 디렉터리와 해당 하위 디렉터리의 모든 파일이 포함됩니다.
디렉터리 메타데이터를 백업하지 않으려면 find
디렉터리 이름을 인쇄하지 않도록 지시하면 됩니다. 단순히 루트 디렉터리를 생략하는 것만으로는 충분하지 않습니다. 하위 디렉터리에서도 마찬가지입니다.
find "$SOURCEDIR" -mtime -1 ! -type d -print | xargs -r tar -rcf "$ARCHIVE"
xargs 사용파일 이름에 공백 및 기타 특수 문자가 포함되어 있으면 실패합니다.. 이는 수정하기 쉽습니다. -exec
대신에 를 사용하세요 xargs
.
find "$SOURCEDIR" -mtime -1 ! -type d -exec tar -rcf "$ARCHIVE" {} +
디렉터리 메타데이터를 백업하려면 find
모든 내용을 인쇄한 다음 tar
하위 디렉터리로 반복하지 않도록 지시하세요. find
재귀가 수행되므로 이는 tar
필요하지 않습니다.
find "$SOURCEDIR" -mtime -1 -exec tar -rcf "$ARCHIVE" --no-recursion {} +
이렇게 하면 tar 호출을 사용하지 않고 tar -rc
먼저 루트 디렉터리만 포함하는 아카이브를 만든 다음 여기에 대량 추가하여 반복되는 tar 호출 문제를 해결할 수 있습니다. (왜 루트 디렉토리입니까? GNU tar는 빈 아카이브를 만드는 것을 두려워하기 때문입니다.)
tar -cf "$ARCHIVE" --no-recursion "$SOURCEDIR"
find "$SOURCEDIR" -mindepth 1 -mtime -1 -exec tar -rf "$ARCHIVE" --no-recursion {} +
답변2
find $SOURCEDIR -mtime -1
$SOURCEDIR
출력에도 포함되어 있으므로 추가 처리 전에 제거해야 합니다.
grep -vx
제외할 특정 행을 정의하려면 하나를 사용하십시오 .
find $SOURCEDIR -mtime -1 -print | grep -xv "$SOURCEDIR" | xargs -r tar cvf $ARCHIVE || { echo "No files have been changed in the past 24 hours. Exiting script ..." ; exit 1; }
답변3
xargs
두 번 호출하면 문제가 발생할 뿐만 아니라 tar
파일 이름에 개행 문자와 같은 특수 문자가 포함되어 있는 경우에도 문제가 발생합니다.
다음 과 함께 xargs
및 tar
사용을 중단해야 합니다 .find
cpio
find $SOURCEDIR -mtime -1 -print0 | cpio --create -0 --verbose \
--format=ustar -O $ARCHIVE
ustar
POSIX.1 호환 tar 파일이 제공됩니다 $ARCHIVE
.
답변4
실행하면 find $SOURCEDIR -mtime -1 -print
첫 번째 결과는 $SOURCEDIR 폴더 자체가 됩니다. 그렇기 때문에 모든 것이 포함되어 있습니다.
첫 번째 결과 또는 를 제외해야 합니다 $SOURCEDIR
.