需要一个shell脚本,bzip2来自某个文件夹的递归每个文件

时间:2015-02-24 18:45:09

标签: linux bash shell scripting zip

我知道写这些脚本真的不是我的强项。 我需要一个shell脚本,它递归地将其文件夹中的每个文件打包成.bz2格式,因为我有很多文件,当我手动执行此操作时需要几个小时。

例如,这里有很多文件(这个例子更多):

/home/user/data/file1.yyy
/home/user/data/file2.xxx
/home/user/data/file3.zzz
/home/user/data/file4.txt
/home/user/data/file5.deb
/home/user/data/moredata/file1.xyz
/home/user/data/muchmoredata/file1.xyx

我需要将它们全部组合成.bz2,就像这样:

/home/user/data/file1.yyy.bz2
/home/user/data/file2.xxx.bz2
/home/user/data/file3.zzz.bz2
/home/user/data/file4.txt.bz2
/home/user/data/file5.deb.bz2
/home/user/data/moredata/file1.xyz.bz2
/home/user/data/muchmoredata/file1.xyx.bz2

当脚本结束时,另一件事情会很棒chown -R example:example /home/user/data

我希望你能帮助我

2 个答案:

答案 0 :(得分:1)

bzip2将在命令行上接受多个文件作为参数。要解决你的具体例子,我会做

cd /home/user/
find . -type f | egrep -v '\.bz2' | xargs bzip2 -9 &

这将找到/home/user下的所有文件,从处理中排除任何已存在的.bz2文件,然后通过xargs将剩余列表发送到bzip2-9为您提供最大压缩(但需要更多时间)。使用xargs提供命令时可以处理的文件名的数量或长度没有限制(在本例中为bzip2)。

& char表示"在后台运行所有这些"。这意味着命令提示符将立即返回给您,并继续其他工作,但不要期望所有文件被压缩一段时间。在某些时候,您还会收到诸如“作业%1 ...已开始”等消息。然后,'工作%1 ...完成'。

当您要求提供脚本时,我们也可以这样做

#!/bin/bash
if [[ ! -d "$1" ]] ; then
   echo "usage: b2zipper /path/to/dir/to/search" 1>&2
   exit 1
if
find "$1" -type f | egrep -v '\.bz2' | xargs bzip2 -9 &

将其另存为b2zipper,然后使用

使其可执行
chmod +x b2zipper

IHTH

答案 1 :(得分:0)

为了建立在已接受的答案上,另一种选择是:

find /path/to/dir -type f -exec bzip2 {} \;