특정 파일을 찾아서 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
이것이 작동하지 않습니다.
tar
1982 년 부터 star
.
star
2005년 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)
이렇게 하면 아카이브에 성공적으로 배치된 파일만 삭제됩니다.