
새 폴더에 각각 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
다음 작업을 실행하기 전에 안전을 위해 최상위 디렉터리의 (재귀) 복사본을 수행하십시오.
다음과 같이 원하는 것을 얻을 수 있습니다.
최상위 디렉터리(사진)를 현재 작업 디렉터리로 만듭니다. 그런 다음 모든 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 파일 구조에 따라 다릅니다. 따라서 복사 및 테스트 실행을 수행하십시오.