다음과 같은 파일 시스템 구조에서:
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는 필요하지 않습니다.