将目录中的每个文件压缩为自己的压缩文件


24

如何在将目录中的每个文件压缩到其自己的tar中的同时保留每个文件的名称?

即file1.out file2.out

->

file1.out.tar.gz file2.out.tar.gz

Answers:


64

在这种情况下,将每个文件放入单独的tar文件中没有任何意义。您可以使用gzip直接压缩它们:

gzip *

将导致file1.out.gzfile2.out.gz等等。

tar仅在需要将压缩存档作为单个文件时才使用。

如果您需要每个文件的tar存档,则可以这样创建它:

for i in *; do tar -czf $i.tar.gz $i; done

7
+1-没有理由为单个文件创建tar(磁带存档)。只需压缩您要压缩的内容-结果将略微变小,并且对于提取文件的人更加有意义。
voretaq7 '02

要压缩每个单独的子目录(仅find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
深一层

(5分钟后无法在上方编辑我的评论)一个更简单/更安全的版本:find . -maxdepth 1 -mindepth 1 -type d -exec tar -zcvf {}.tgz {} --remove-files \;
xb。

9

要基于@SvenW的答案(仅适用于当前目录),如果文件数量巨大或想要在递归目录结构上进行操作,也可以使用

find . -type f -exec gzip \{\} \;

如果您需要将输出放入另一个目录(在此示例中为../target),并且不想删除原始目录,则可以执行以下操作:

find . -type f -print | while read fname ; do
    mkdir -p "../target/`dirname \"$fname\"`"
    gzip -c "$fname" > "../target/$fname.gz"
done

1
find . -type f -exec gzip {} \;就足够了。第二个代码将失败,并且文件名包含空格等。
用户未知

有些外壳不喜欢裸露的{},而第二个外壳的作用与第一个外壳明显不同(我知道间距问题,但这有点棘手)。
蓬松的2012年

如果您知道这样的外壳,我邀请您在这里回答我的问题:unix.stackexchange.com/questions/8647/…。到目前为止,没人能说出目前正在使用的东西。如果您知道答案的风险,则最好在答案中命名。
用户未知

@userunknown我是在(t)csh那里长大的,尽管一次似乎没有出现过,但在一次使用未转义的花括号时遇到了很多麻烦(但是我仍然{}习惯了逃脱)。但是,其他人已经将其发布为您问题的答案。
蓬松的

或者,压缩所有非二进制文件:find . -type f -exec grep -Iq . {} \; -and -exec gzip {} \;
xb。

0

试试这个:

#!/bin/bash
for fich in *; do
    if [ "$fich" != "*" ] ; then
        gzip -9 -c $fich > $fich.tar.gz
        \mv $fich.tar.gz $fich
    fi
done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.