tar를 find와 함께 사용하기

tar를 find와 함께 사용하기

특정 파일을 찾아서 tar하고 삭제한다고 가정해 보겠습니다. 나는 사용하려고

touch "mycompress.bz2.tar"
find . \( -name "*.c" -o -name "*.sh*" \) -exec tar ujf "mycompress.bz2.tar" {} "+" \; -exec rm {} \;

하지만 이것을 실행하면 터미널이 닫힙니다. 이것을 어떻게 올바르게 구현할 수 있습니까?

답변1

명령에 몇 가지 문제가 있습니다.

첫 번째는 압축된 아카이브를 업데이트할 수 없다는 것입니다. 먼저 압축되지 않은 아카이브를 생성하고 업데이트한 후 마지막으로 압축해야 합니다.

두 번째 절은 tar문법적으로 올바르지 않습니다. 첫 번째 절에서는 종결자나 종결 자 중 하나를 -exec사용해야 하지만 둘 다 사용할 수는 없습니다.+\;

세 번째 절은 좀 더 미묘합니다. +종결자가 보존되면 어떻게 될까요? 두 번째 -exec절은 각 파일에 대해 순차적으로 실행되는 반면, 첫 번째 절은 파일 목록이 저장되어 환경 문자열을 채울 때까지 기다립니다. 이런 일이 발생하면 첫 번째 파일이 저장하려는 모든 파일이 -exec두 번째 파일에 의해 삭제되므로 실패하게 되고 모든 파일을 잃게 됩니다 -exec.tar

의심할 여지없이 를 사용하고 있습니다 GNU tar. 원하는 것을 달성하는 간단한 방법은 다음과 같습니다.

tar --files-from <(find . \( -name "*.c" -o -name "*.sh*" \)) \
    --remove-files -cjf mycompress.bz2.tar

GNU tar는 파일을 저장한 후에만 파일을 삭제하도록 문서화되어 있습니다.

$ man gtar
...
       --remove-files
              remove files after adding them to the archive
...

내가 제안하는 명령은 줄 바꿈이 포함된 파일을 처리하지 않지만 이는 일어날 가능성이 거의 없는 일입니다.

답변2

일반적인 구현 중 하나에서는 tar이것이 작동하지 않습니다.

tar1982 년 부터 star.

star2005년 find내 기반 libfind.

당신이 전화star -c -f file.out -find . \( -name "*.c" -o -name "*.sh*" \)

기본 제공 규칙은 간단합니다. find오른쪽에 있는 모든 항목이 따르는 -find명령줄 규칙입니다 find(1).

바라보다http://schilytools.sourceforge.net/index.html

그리고 스타 매뉴얼 페이지는 다음과 같습니다.http://schilytools.sourceforge.net/man/man1/star.1.html

별도의 소스(홈페이지 참조)가 있지만 현재 최신, 최고의 버전이 나와 있습니다 schilytools.

명령에 문제가 있을 수 있으므로 보관할 때 파일을 삭제하면 더 이상 사용할 수 없는 파일이 삭제될 위험이 높다는 점을 명심하세요. 따라서 먼저 내 제안을 사용하여 파일을 보관한 후 다음을 호출하는 것이 좋습니다.

rm $(star -t -tpath < file.out)

이렇게 하면 아카이브에 성공적으로 배치된 파일만 삭제됩니다.

관련 정보