여러 디렉토리를 개별 zip 파일로 압축하는 명령


40

내부에 수십 개의 디렉토리가 포함 된 단일 디렉토리가 있습니다.

나는 커맨드 라인을 처음 사용하고 각 하위 디렉토리를 고유 한 subdirectory.zip 파일로 압축하는 명령을 내기 위해 고심하고 있습니다.

결국 기본 디렉토리는 모든 원본 하위 디렉토리와 .zip각 하위 디렉토리의 압축 된 내용이 들어있는 해당 파일 로 채워집니다 .

이와 같은 것이 가능합니까? 그렇다면 어떻게했는지 알려주십시오.


쉘에서 "for loop"가 어떻게 수행되는지 찾아 보자. 원하는 것을 할 수있는 온라인 사용자가 있지만 멋진 루프가 훨씬 명확합니다.
lynxlynxlynx

따라서 별도의 셸 스크립트를 작성한 다음 명령 줄에서 해당 스크립트를 호출해야합니까? 그런 기본적인 질문에 대해 죄송합니다. 비록 프로그래밍 경험이 있지만이 물건은 나에게 새로운 것입니다.
Evster

답변:


75

이 루프는 bash다음 에서 사용할 수 있습니다 .

for i in */; do zip -r "${i%/}.zip" "$i"; done

i루프 변수의 이름입니다. */는 현재 디렉토리의 모든 하위 디렉토리를 의미하며 해당 이름에 슬래시를 포함합니다. cd이를 실행하기 전에 올바른 위치에 있는지 확인하십시오 . "$i"뒤에 슬래시를 포함하여 해당 디렉토리의 이름을 지정하십시오. 인용 부호는 디렉토리 이름의 공백이 문제를 일으키지 않도록합니다. 후행 슬래시가 제거 된 ${i%/}것과 같으 $i므로이를 사용하여 zip 파일의 이름을 구성 할 수 있습니다.

이것이 작동하는 방식을 보려면 echobefore를 포함 zip하면 명령 대신 실행 된 명령이 표시됩니다.


고마워요! 그러나 내가 생각한 한 가지 잠재적 인 문제 : 각 하위 디렉토리의 모든 디렉토리를 별도의 파일로 압축합니까? 1 수준 하위 디렉토리를 단일 압축 파일로 압축하고 싶습니다. 2 단계, 3 단계 하위 디렉토리 등에 대한 추가 zip 파일을 생성하고 싶지 않습니다. 그럴 경우 알려주십시오. 다시 감사합니다!
Evster

귀하가 요청한 첫 번째 수준 만 있습니다.
lynxlynxlynx

*/모든 하위 디렉토리가 아닌 모든 직접 서브 디렉토리 의 이름입니다. 따라서 원하는 방식으로 최상위 레벨의 지퍼 만 얻을 수 있습니다. 에 포함 된 버전 echo은 그러한 측면을 보여 주었을 것입니다. 모든 중첩 디렉토리를 자체 파일에 압축하면 실제로 더 많은 작업이 가능하며 find -type d다른 트릭 중에서 가장 잘 해결됩니다 .
MvG

1
@ fritzmg : Linux에서 로컬 테스트를 수행하면 점으로 시작하는 파일이 포함되어 있음을 알 수 있습니다. 이것은 내가 준 명령이 아니라 Info-ZIP 도구의 속성이므로 zip바이너리 에 따라 다른 동작이 발생할 수 있습니다. 점으로 시작하는 최상위 디렉토리 (즉, 현재 디렉토리의 하위)에 대한 zip 파일을 작성 shopt -s dotglob하기 위해 glob 패턴을 숨겨진 파일과도 일치시키는 데 사용할 수 있습니다 .
MvG

1
부모 디렉토리를 루트로 가지고 있지 않은 zip을 만들려면 :for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.