如何将目录中的所有目录压缩为以压缩目录命名的文件

如何将目录中的所有目录压缩为以压缩目录命名的文件

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

相关内容