'find -mtime -1 -print | xargs tar' 아카이브 디렉토리의 모든 파일, -mtime -1 매개변수 무시

'find -mtime -1 -print | xargs tar' 아카이브 디렉토리의 모든 파일, -mtime -1 매개변수 무시

백업 스크립트를 만들려고 합니다. 저는 이 스크립트를 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. 처음에 이것을 추가한 이유는 find100개 이상의 결과가 반환될 때 아카이브를 덮어쓰는 것을 방지하고 싶었기 때문입니다.

이제 실질적인 문제로 넘어갑니다.내가 달릴 때마다

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파일 이름에 개행 문자와 같은 특수 문자가 포함되어 있는 경우에도 문제가 발생합니다.

다음 과 함께 xargstar사용을 중단해야 합니다 .findcpio

find $SOURCEDIR -mtime -1 -print0 | cpio --create -0 --verbose \
     --format=ustar -O $ARCHIVE

ustarPOSIX.1 호환 tar 파일이 제공됩니다 $ARCHIVE.

답변4

실행하면 find $SOURCEDIR -mtime -1 -print첫 번째 결과는 $SOURCEDIR 폴더 자체가 됩니다. 그렇기 때문에 모든 것이 포함되어 있습니다.
첫 번째 결과 또는 를 제외해야 합니다 $SOURCEDIR.

관련 정보