我在位置/ home / Docs / Calc中有* .xls文件。该文件夹中有多个子目录。例如
/home/Docs/Calc/2011
/home/Docs/Calc/2012
/home/Docs/Calc/2013
我可以使用find命令
对子目录下的每个文件进行gzipfind /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。所有这些都有年份子文件夹
答案 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文件。