root@linux:/mnt/TEST# ls
test1.txt test2.txt test3.txt
root@linux:/mnt/TEST# find /mnt/TEST/ -mmin -10 -exec tar -czvf /tmp/test.tar.gz {} +
tar: Removing leading `/' from member names
/mnt/TEST/
/mnt/TEST/test3.txt
/mnt/TEST/test2.txt
/mnt/TEST/test1.txt
tar: Removing leading `/' from hard link targets
/mnt/TEST/test3.txt
/mnt/TEST/test2.txt
/mnt/TEST/test1.txt
root@linux:/mnt/TEST# tar -tvf /tmp/test.tar.gz
drwxr-xr-x root/root 0 2017-10-08 00:15 mnt/TEST/
-rw-r--r-- root/root 0 2017-10-08 00:15 mnt/TEST/test3.txt
-rw-r--r-- root/root 0 2017-10-08 00:15 mnt/TEST/test2.txt
-rw-r--r-- root/root 0 2017-10-08 00:15 mnt/TEST/test1.txt
hrw-r--r-- root/root 0 2017-10-08 00:15 mnt/TEST/test3.txt link to mnt/TEST/test3.txt
hrw-r--r-- root/root 0 2017-10-08 00:15 mnt/TEST/test2.txt link to mnt/TEST/test2.txt
hrw-r--r-- root/root 0 2017-10-08 00:15 mnt/TEST/test1.txt link to mnt/TEST/test1.txt
답변1
이러한 파일을 두 번 포함하면 GNU는 tar
두 번째 파일 세트가 첫 번째 파일 세트와 동일한 inode를 갖기 때문에 하드 링크여야 한다고 인식하고 가정합니다.
두 번 보관합니다.
- 먼저 ( 기준을
/mnt/TEST
충족하는 ) 아카이브 디렉터리를 통해 ,find
- 그런 다음 개별 파일을 다시 보관하십시오.
find
일반 파일만 찾도록 명령을 수정해야 합니다 .
find /mnt/TEST/ -type f -mmin -10 -exec tar -czvf /tmp/test.tar.gz {} +
또한 find
명령이 단일 호출로 처리할 수 있는 것보다 더 많은 파일을 찾으면 여러 번 tar
호출되어 tar
매번 tar 아카이브를 덮어씁니다.
이 문제를 해결하세요:
find /mnt/TEST/ -type f -mmin -10 \
-exec sh -c 'a="/tmp/test.tar.gz"; if [ -f "$a" ]; then tar -uzvf "$a" "$@"; else tar -czvf "$a" "$@"; fi' sh {} +
이것은 것이다추가의아카이브가 존재하면( ) 파일이 아카이브에 추가되고 tar -u
, 그렇지 않으면 아카이브가 생성됩니다( tar -c
).