我想将单个目录中的所有目录压缩为以它们自己命名的文件,因此例如使用 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