단일 명령으로 특정 유형의 각 파일에 대한 tar.gz를 만드는 방법은 무엇입니까?

단일 명령으로 특정 유형의 각 파일에 대한 tar.gz를 만드는 방법은 무엇입니까?

*.html특정 유형의 모든 파일을 해당 위치에서 압축하고 압축을 풀어야 합니다. 압축을 풀기 위해 다음 명령을 사용했는데 제게는 효과가 있는 것 같았습니다.

find dir -name "*.html.tar.gz" -exec tar -xvzf {} \;

나는 *.htmp.tar.gz각각의 디렉토리에서 그것을 볼 수 있습니다.

압축을 위해 다음 명령을 실행하려고 하는데 find의 인수 연결이 발생하지 않기 때문에 작동하지 않습니다.

find dir -name "*.html" -exec tar -cvzf {}.tar.gz {} \;

솔루션을 제안하고 스트레스 감소 솔루션이 완벽한지 알려주세요.

편집: 내가 지금 사용하고 있는 것은 대상 이름이 필요하지 않지만 그것이 전혀 불가능한지 gunzip궁금합니다 . tar따라서 원래의 문제를 해결하는 답변을 기다리고 있습니다.

fork()편집: 요구 사항은 C 함수 와 명령을 통해 실행해야 하는 명령을 갖는 것입니다 . exec()그래서 저는 파이프라인이 가능하다고 생각하지 않습니다.

편집: 또한 압축에 가능한 한 적은 시간이 걸리기를 원하므로 효율적인 방법을 찾고 있습니다.

답변1

find . -name '*.html' -type f -exec sh -c '
   for file do tar czf "$file.tar.gz" "$file"; done' sh {} +

C에서:

execlp("find", "find", ".", "-name", "*.html", "-type", "f", "-exec",
       "sh", "-c", "for file do tar czf \"$file.tar.gz\" \"$file\"; done",
       "sh", "{}", "+", 0);

호출자에게 실패 또는 보관 프로세스를 보고하려면 다음과 같이 개선할 수 있습니다.

find . -name '*.html' -type f -exec sh -c '
  ok=true
  for file do
    tar czf "$file.tar.gz" "$file" || ok=false
  done
  "$ok"' sh {} +

-exec cmd {} +경우 find명령을 실행하기 위해 생성된 프로세스가 0이 아닌 종료 상태로 반환되면 0이 아닌 종료 상태로 종료됩니다.

답변2

xargs이를 달성하려면 다음 방법을 사용해야 합니다 .

find "dir" -name "*.html" -print0 | xargs -0 -n1 -I % tar zcpf %.tar.gz %

파일 이름의 거의 모든 특수 문자를 처리합니다.

관련 정보