단일 디렉토리의 모든 디렉토리를 자신의 이름을 딴 파일로 압축하고 싶습니다. 예를 들어 tar-all.sh를 사용합니다.
dir___
|- dirA
|- dirB
|- tar-all.sh
~이 되다
dir___
|- dirA.tar.tgz
|- dirB.tar.tgz
|- tar-all.sh
답변1
for
루프를 사용하십시오 .
#!/bin/bash
for f in *
do
echo "Creating tarball of $f..."
tar -zcf $f.tar.gz $f
done
결과 :
> ./tar-all.sh
> Creating tarball of tar-all.sh...
> Creating tarball of dirA...
> Creating tarball of dirB...
> DONE!
|- dirA.tar.tgz
|- dirB.tar.tgz
|- tar-all.sh.tar.gz
답변2
다음은 이 디렉터리의 모든 하위 디렉터리를 찾아 보관합니다 dir
(원래 하위 디렉터리 제거).
for subdir in dir/*/; do
dirname="$( basename "$subdir" )"
( cd "$dir" && tar -cz -f "$dirname.tgz" "$dirname" && rm -rf "$dirname" )
done
이 패턴은 dir/*/
그 아래 하위 디렉터리의 경로 이름과만 일치하며 dir
디렉터리가 아닌 경로 이름에는 일치하지 않습니다 /
.
또는 명시적 대신 -C
옵션을 사용하십시오 .tar
cd
for subdir in dir/*/; do
dirname="$( basename "$subdir" )"
tar -cz -f "dir/$dirname.tgz" -C dir "$dirname" && rm -rf "$subdir"
done
시험:
$ tree
.
`-- dir
|-- a
| `-- file
|-- b
| `-- file
|-- c
| `-- file
`-- complicated name
`-- file
5 directories, 4 files
(여기서 두 루프 중 하나를 실행하십시오)
$ tree
.
`-- dir
|-- a.tgz
|-- b.tgz
|-- c.tgz
`-- complicated name.tgz
1 directory, 4 files