여러 하위 폴더의 모든 파일을 압축하는 방법은 무엇입니까?

여러 하위 폴더의 모든 파일을 압축하는 방법은 무엇입니까?

원본 입력:

    ➜  test tree
    .
    ├── f1.md
    ├── f2.md
    ├── f3.md
    ├── f4.txt
    ├── f5.csv
    ├── f6.doc
    ├── s1
    │   ├── code
    │   └── data
    │       ├── f1.md
    │       ├── f2.md
    │       ├── f3.md
    │       ├── f4.txt
    │       ├── f5.csv
    │       └── f6.doc
    ├── s2
    │   ├── code
    │   └── data
    │       ├── f1.md
    │       ├── f2.md
    │       ├── f3.md
    │       ├── f4.txt
    │       ├── f5.csv
    │       └── f6.doc
    ├── s3
    │   ├── code
    │   └── data
    │       ├── f1.md
    │       ├── f2.md
    │       ├── f3.md
    │       ├── f4.txt
    │       ├── f5.csv
    │       └── f6.doc
    └── s4
        ├── code
        └── data
            ├── f1.md
            ├── f2.md
            ├── f3.md
            ├── f4.txt
            ├── f5.csv
            └── f6.doc

    12 directories, 30 files

예상 출력

➜  test tree
.
├── f1.md
├── f2.md
├── f3.md
├── f4.txt
├── f5.csv
├── f6.doc
├── s1
│   ├── code
│   └── data
│       ├── Archive.zip
│       ├── f1.md
│       ├── f2.md
│       ├── f3.md
│       ├── f4.txt
│       ├── f5.csv
│       └── f6.doc
├── s2
│   ├── code
│   └── data
│       ├── Archive.zip
│       ├── f1.md
│       ├── f2.md
│       ├── f3.md
│       ├── f4.txt
│       ├── f5.csv
│       └── f6.doc
├── s3
│   ├── code
│   └── data
│       ├── f1.md
│       ├── f2.md
│       ├── f3.md
│       ├── f4.txt
│       ├── f5.csv
│       └── f6.doc
└── s4
    ├── code
    └── data
        ├── Archive.zip
        ├── f1.md
        ├── f2.md
        ├── f3.md
        ├── f4.txt
        ├── f5.csv
        └── f6.doc

12 directories, 33 files

하위 폴더(s1/s2/s4)의 파일을 압축하고 싶습니다.

zip -r Archive.zip ./*각 하위 폴더(s1/s2/s4)에서 명령줄을 사용해 보았습니다. 같은 명령어를 세번이나 입력해야 해서 불편하네요.

일회성 명령을 사용하거나 스크립트를 작성하여 이를 달성하려면 어떻게 해야 합니까? 저는 OSX(10.12.6)를 사용하고 있습니다.

답변1

find . -type d -name data -execdir zip -jr data/Archive.zip data ';'

이 명령은 현재 디렉토리 아래의 각 디렉토리를 find검색하여 실행합니다.data

zip -jr data/Archive.zip data

sN디렉토리(디렉토리의 상위 디렉토리 data)에 있습니다. 숨겨진 파일도 보관됩니다.

플래그는 -j아카이브 zip에 추가된 파일의 경로 이름을 제거하고 아카이브는 data디렉토리 내에 배치됩니다.

-execdir이는 기본적으로 cd명령을 실행하기 전에 찾은 항목의 상위 디렉터리에서 작업이 수행되기 때문에 작동합니다 .

s3이 디렉토리를 피하려면 다음을 사용하십시오.

find . -type d -name data \! -path "./s3/*" -execdir zip -jr data/Archive.zip data ';'

답변2

다음과 같은 스크립트가 작업을 수행합니다.

for i in `find /path -type d -name data`;
do
if [ "$i" = "s3/data" ]
 then continue
 else cd "$i" && zip Archive.zip *
fi
done

PS는 /path디렉토리 트리의 시작점으로 대체되었습니다.

답변3

POSIXly(분명히 명령은 제외 zip):

find . -path ./s3 -prune -o -type d -name data -exec sh -c '
   for dir do
     (cd "$dir" && zip -r Archive.zip .)
   done' sh {} +

또는 다음을 사용하여 zsh -o extendedglob:

for dir (./**/data~*/s3/*(/N)) (cd $dir && zip -r Archive.zip .)

data또는 폴더를 재귀적으로 검색하지 않으려는 경우 :

for dir (./^s3/data(/N)) (cd $dir && zip -r Archive.zip .)

또는 더 구체적으로 말하면(여기에서는 필요하지 않음 extendedglob):

for dir (s[124]/data(/N)) (cd $dir && zip -r Archive.zip .)

관련 정보