如何.bz2
在 Linux 中以递归方式 bzip2 压缩所有不以扩展名结尾的文件?
答案1
find 是你的朋友。我认为以下应该可以做到:
find <target_dir> -not -name \*.bz2 -exec bzip2 \{\} \;
例如,如果要 bzip 的文件所在的目录是 /var/log/blah,则其内容为:
find /var/log/blah -not -name \*.bz2 -exec bzip2 \{\} \;
答案2
我首先想到的是(抱歉,手边没有 shell 来测试引用等):
for _t in `find . -print |grep -v -E "\.bz$"`; do bzip2 -9 $_t && echo OK $_t || echo FAIL $_t; done
这将使用 find 查找所有文件,使用 grep 删除带有 .bz2 扩展名的文件,然后将它们逐个输入到 bzip2 中。不过,我预计有些引用是错误的 - 我会先单独测试反引号中的位。
祝你好运!不过,你可能想改用 xz - 通常压缩效果更好 - 或者甚至将所有内容打包成 tar,然后改用 bzip2 或 xz。
答案3
使用 zsh (setopt extended_glob
必须开启):
bzip2 **/^*.bz2(.)
**
在子目录中递归;^*.bz2
匹配除 之外的所有内容*.bz2
;(.)
限制为常规文件。
使用 bash 4,如果您可以忽略bzip2
有关在目录中调用的抱怨:
bzip2 **/!(*.bz2)
答案4
在fish
控制台中,它非常简单,您不必担心管道和奇怪的反斜杠:
set files (find *)
for i in $files
bzip2 $i
end