1

我在 /home/Docs/Calc 位置有 *.xls 文件。该文件夹中有多个子目录。例如

/home/Docs/Calc/2011
/home/Docs/Calc/2012
/home/Docs/Calc/2013

我可以使用 find 命令压缩子目录下的每个文件,

find /home/Docs/Calc -iname "*.xls" -exec gzip {} \;

但是我怎样才能压缩每个子目录中的所有文件呢?例如。

/home/Docs/Calc/2011/2011.tar.gz
/home/Docs/Calc/2012/2012.tar.gz
/home/Docs/Calc/2013/2013.tar.gz

我必须补充一点,/home/Docs/Calc 是众多文件夹之一,例如 Calc-work、calc-tax、calc-bills。所有这些都有年份子文件夹

4

5 回答 5

5

由于我们不必递归,我不会find使用通配符和for循环来处理它。如果我们在Calc目录中,echo *将为我们提供所有目录名称:

~/Docs/Calc$ echo *
2011 2012 2013

碰巧我们可以使用for循环来迭代这些并以通常的方式将它们压缩:

for year in *; do
    tar czf $year.tar.gz $year
done

如果您希望在 year 目录中生成 tarball,您可以在命令mv后添加一个。tar我会犹豫是否从一开始就将 tarball 放入目录中,否则 tar 可能会开始尝试将自己的输出 tar 到自身中。

于 2013-09-06T03:34:54.160 回答
2

我在我的 .bashrc 中设置了一个简单的函数:

function gzdp () {
find . -type f -name "$@" -exec gzip {} \;
}

调用该函数时,$@它会自动替换为后面的任何内容。gzdp现在,在您的命令窗口中,您可以导航到该/home/Docs/Calc/文件夹​​并调用:

gzdp *.txt

它应该压缩所有较低子目录中的所有 .txt 文件。

不确定这是否有帮助,我在这个网站上的第一篇文章。小心不要意外gzip不想要的 .txt 文件。

于 2013-10-11T13:52:37.650 回答
2

尝试这个:

find /home/Docs/Calc -type d -exec tar cvzf {}.tar.gz {} \;
于 2013-09-06T03:35:08.723 回答
1

您可以使用以下 shell 脚本:

#!/bin/bash

cd /home/Docs/Calc/
find=`find . -type d`
for f in $find; do
    cd $f   
    tar -cvz *.xls >> ${f##*/}.tar.gz
    cd -
done
于 2013-09-06T04:03:57.997 回答
1

试试这个脚本:

#!/bin/bash
find /home/Docs/Calc/ -mindepth 1 -type d | while read -r DIR; do
    NAME=${DIR##*/}
    pushd "$DIR" >/dev/null && {
        tar -cvpzf "${NAME}.tar.gz" *
        popd >/dev/null
    }
done
于 2013-09-06T03:54:26.143 回答