모두 zip 파일이 포함된 폴더 세트가 있습니다. 각 폴더에는 1~2개의 파일이 포함될 수 있으며 각 파일은 새 폴더에 있습니다. (아래 참조)
스크립트를 최상위 디렉터리로 지정하고 각 하위 디렉터리를 반복하고 zip의 내용을 추출하고 해당 하위 디렉터리의 콘텐츠를 한 수준 위로 이동하고 싶습니다(선택적으로 원본 zip 파일 삭제).
--before--
Photos
-2018
--jan.zip
[--jan1 ]--\
[---jan1.pdf]---}-contents of Zipped file
[---jan1.JPG]--/
--feb.zip
[--feb1 ]--\
[---feb1.pdf]---}-contents of Zipped file
[---feb1.JPG]--/
...
--after--
Photos
-2018
--jan1.pdf
--jan1.JPG
--feb1.pdf
--feb1.JPG
답변1
다음 작업을 수행하기 전에 안전을 위해 최상위 디렉터리의 (재귀) 복사본을 만드십시오.
다음과 같이 원하는 것을 얻을 수 있습니다.
최상위 디렉터리(photos)를 현재 작업 디렉터리로 설정합니다. 그런 다음 모든 zip 파일의 압축을 풉니다.
find . -iname "*.zip" -execdir unzip {} \;
이제 추출된 디렉터리의 내용을 한 수준 위로 이동합니다.
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. \;
이는 이 단계에서 비어 있게 되는 zip 파일이나 추출된 디렉터리 자체에는 영향을 주지 않습니다. 이제 삭제할 수 있습니다.
find . -mindepth 2 -maxdepth 2 -type d -delete
zip 파일을 삭제하기 전에 모든 것이 올바른지 다시 확인하세요. 그런 다음 다음 명령을 사용하여 삭제할 수 있습니다.
find . -iname "*.zip" -delete
원칙적으로 이러한 명령을 스크립트로 결합할 수 있지만 먼저 하나씩 테스트하고 각 단계 후에 결과를 확인하는 것이 좋습니다.
최상위 디렉터리를 유일한 인수로 사용하는 스크립트는 다음과 같습니다.
#!/bin/bash
cd "$1"
find . -iname "*.zip" -execdir unzip {} \;
find . -type f ! -iname "*.zip" -execdir mv "$(basename {})" .. \;
find . -mindepth 2 -maxdepth 2 -type d -delete
find . -iname "*.zip" -delete
이름을 "extract"로 지정하고 실행 권한을 설정하면 다음과 같이 자체 디렉터리에서 사용할 수 있습니다( ~/photos
최상위 디렉터리라고 가정).
./extract ~/photos
하지만 참고하세요: 이 스크립트는 테스트된 적이 없습니다. 자체 테스트도 수행하지 않습니다. 그것은 모두 설명하는 디렉토리와 zip 파일 구조에 따라 다릅니다. 그러니 꼭 복사해서 테스트 실행해 보세요.