在子目录中查找和gzip文件

时间:2013-09-06 03:25:03

标签: bash

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

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

我可以使用find命令

对子目录下的每个文件进行gzip
find /home/Docs/Calc -iname "*.xls" -exec gzip {} \;

但是如何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。所有这些都有年份子文件夹

5 个答案:

答案 0 :(得分:5)

由于我们不必递归,因此我不会使用find,而是使用globbing和for循环。如果我们在Calc目录中,echo *将为我们提供所有目录名称:

~/Docs/Calc$ echo *
2011 2012 2013

恰巧我们可以使用for循环来迭代这些并以通常的方式对它们进行tar:

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

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

答案 1 :(得分:2)

试试这个:

find /home/Docs/Calc -type d -exec tar cvzf {}.tar.gz {} \;

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:0)

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

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

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

gzdp *.txt

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

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