여러 파일을 별도의 아카이브로 압축하는 방법은 무엇입니까?

여러 파일을 별도의 아카이브로 압축하는 방법은 무엇입니까?

나는 이 질문이 이전에 여기서 요청되었음을 인정합니다.

좋다별도의 파일로 압축질문한 사람이 자신이 사용하는 OS를 지정하지 않아 답변을 받지 못한 경우.

거대한 디렉토리를 서로 상호 의존적이지 않은 여러 .zip 파일로 분리해야 합니다. 따라서 대신:

파일1.zip
파일2.z01
파일3.z02

대신 다음 파일 세트를 원합니다.

파일1.zip
파일2.zip
파일3.zip

기본적으로 이것은 내 질문입니다. 저는 OS X를 사용하고 있으므로 쉘 스크립트나 AppleScript를 사용하는 것이 가장 쉬운 방법입니다.

또한, 같은 질문을 한 사람이 있습니다. 그는 .tar 아카이브를 만들고 싶었습니다. 방법파일 세트에 대해 별도의 아카이브 생성

대답은 정확하지만 tar 파일이 생성됩니다.

for file in `ls *`; do tar -czvf $file.tar.gz $file ; done

추신: 이 마지막 부분은 Keyboard Maestro에 적합한 분들을 위한 것입니다.

또한 Keyboard Maestro에서 이 작업을 수행하려고 했습니다. 파일 경로를 결정한 다음 쉘 스크립트를 트리거하는 "각각" 작업 설정이 있습니다. 출력은 정확하며 터미널에 붙여넣으면 매크로가 작동합니다(예: zip /Users/me/Desktop/test /Users/me/Desktop/test.txt).

그러나 두 변수를 Keyboard Maestro의 쉘 스크립트에 전달하면 작동하지 않습니다.
zip "$KMVAR_zipPath" "$KMVAR_sourcePath"

답변1

해결책은 매우 쉽습니다. 모든 파일에 대해 이 작업을 반복적으로 수행하려면 find. 모든 파일과 디렉터리를 나열하고 하위 디렉터리에도 나열합니다.

find . -type f -execdir zip '{}.zip' '{}' \;

설명:

  • 첫 번째 인수는 시작하려는 디렉터리입니다..
  • 그런 다음 파일만 찾도록 제한하겠습니다( -type f).
  • -execdir옵션을 사용하면 발견된 각 파일에 대해 명령을 실행하여 파일 디렉터리에서 실행할 수 있습니다.
  • zip file.txt.zip file.txt예를 들어, 이 명령은 의 모든 발생이 {}실제 파일 이름으로 대체되므로 로 평가됩니다 . 이 명령은 다음으로 끝나야 합니다.\;

물론 find더 많은 옵션이 있습니다. 대신 하위 디렉터리로 내려가지 않고 현재 디렉터리에 머물고 싶다면 다음을 수행하세요.

find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;

특정 파일 형식으로 제한하려면 -name옵션(또는 -iname대소문자를 구분하지 않는 일치)을 사용하세요.

find . -type f -name "*.txt" …

다른 모든 것( for의 출력에 대한 반복 포함 ls *)은 제 생각에는 매우 보기 흉한 구문이며 예를 들어 이름에 공백이 있거나 인수가 너무 많은 파일에서는 깨질 가능성이 높습니다.

관련 정보