ディレクトリ内のすべてのファイルを独自の圧縮ファイルに圧縮します


24

各ファイルの名前を維持しながら、ディレクトリ内のすべてのファイルを独自のtarに圧縮するにはどうすればよいですか?

すなわち、file1.out file2.out

->

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

回答:


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(Tape ARchive)を作成する理由はありません。圧縮したいものを圧縮するだけです。結果はわずかに小さくなり、ファイルを抽出する人にとって無限に意味があります。
voretaq7

個々のサブディレクトリ(1レベルだけ深さ)をtarし、オリジナルを削除するには:find . -maxdepth 1 -type d ! -path . | while read a_dir; do tar -zcvf ${a_dir}.tgz ${a_dir} --remove-files; done
xb。

(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 {} \;十分になります。2番目のコードは、スペースなどを含むファイル名で失敗します。
ユーザー不明

いくつかのシェルは裸の{}を好まず、2番目のシェルは最初のシェルとは著しく異なることを行います(そして、スペースの問題を認識していましたが、対処するのはややこしいです)。
ふわふわ

あなたは、このようなシェルを知っていれば、私はここの上に私の質問に答えるためにあなたを招待: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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.