최상위(부모) 디렉터리 없이 여러 n번째 수준 하위 디렉터리를 압축하는 방법은 무엇입니까?

최상위(부모) 디렉터리 없이 여러 n번째 수준 하위 디렉터리를 압축하는 방법은 무엇입니까?

다음과 같은 파일 시스템 구조에서:

root/
    |
    container1/
    |         |
    |         subdir2/
    |                |
    |                subdir3/
    |                       |
    |                       subdir4/
    |                              |
    |                              file1
    |                              file2
    |                              subdir5/
    container2/
              |...

모든 것을 압축해야 합니다.

  • "/subdir4/" 아래
  • /subdir4/그 자체 없이
  • /container/디렉토리의 모든 잠재적 하위 root/디렉토리
  • zip 이름을 압축된 콘텐츠의 상위 폴더와 동일한 이름으로 지정합니다(이 경우 "subdir4.zip").

기억해 주세요:

  • 이는 디렉터리와 하위 디렉터리의 실제 이름이 아니며 단지 대략적인 이름입니다.
  • Mac OSX에서 ZSH를 사용하고 있습니다.
  • Unix/Linux 스크립팅이 처음입니다.

나는 가능한 한 많은 것을 배울 수 있고 다른 잠재적인 상황에 대해 이 솔루션을 수정할 수 있는 유연성을 가질 수 있도록 쉘에 구애받지 않고 간단한 루프 유형 솔루션을 정말로 원합니다.

내가 지금까지 시도한 것은 다음과 같습니다., 친구가 제안한 대로:

find . -mindepth 5 -maxdepth 5 -type d -exec sh -c '
pushd "$0/..";zip -rFS "$(basename "$0").zip" "$(basename "$0")";popd ' {} \;

동시에 저는 이 솔루션에 다음과 같은 단점이 있다는 것을 알게 되었습니다.

  • $0은 오류 보고 및/또는 쉘 스크립트 이름으로 사용되므로 위치 인수로 사용하면 안 됩니다(제 경우에는 문자열일 뿐입니다).
  • basename그리고 dirname피하세요 (더 읽어보세요여기)
  • 이 구문은 ... {} \;결과만큼 많은 쉘을 호출하며 이러한 작업을 수행하는 효율적인 방법이 아니라고 합니다.

나는 항상 다음을 사용해야 합니다:

  • 내 위치 매개변수에 $1
  • ... ;popd ' sh {} +

이는 모든 결과를 "배열/목록"으로 가져와 sh모든 결과에 전달된 문자열의 명령을 즉시 적용해야 합니다.

감사해요!

보너스 포인트::)

  • 생성된 .zip의 이름을 이 계층 구조 /subdir3/와 동일한 이름으로 지정할 수 있나요 /subdir4/?

답변1

awk를 사용하여 실행할 시스템 명령을 생성할 수 있습니다.

find * -mindepth 5 -maxdepth 5 -type d  | awk -F"/" '{system( "cd "$0"; zip -rF "$NF".zip *")}'

/에서 -F줄을 분할하여 $0전체 줄을 나타내고 $NF실제 디렉터리 이름을 갖습니다. 시스템 명령은 자체 쉘에서 실행되고 상위 쉘은 현재 작업 디렉토리에 남아 있으므로 popd는 필요하지 않습니다.

관련 정보