원본 입력:
➜ 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 .)