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

Need a shell script that bzip2's every single file recursively from a certain folder

我知道写那些剧本真的不是我的强项。 我需要一个 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

希望你能帮帮我

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

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

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

& 字符表示 "run all of this in the background"。这意味着命令提示符将立即 return 给你,你继续其他工作,但不要指望所有文件都被压缩一段时间。在某些时候,您还会收到 'Job %1 ... started' 等消息,之后会收到 'Job %1 ... finished'.

正如您要求的脚本,我们也可以这样做

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

将其保存为 b2zipper,然后使用

使其可执行
chmod +x b2zipper

IHTH

要基于已接受的答案,替代方案是:

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