すべてのファイルを削除せずにgzipします


11

後で元のファイルを削除せずに、サブディレクトリ内のすべてのファイルを含む、dir内のすべてのファイルを個別にgzipする必要があります。index.htmlがあるとします。最後にindex.html.gzipとindex.htmlが必要です。

私は私のディレクトリ内のすべてのファイルをgzipすることができます

gzip -r .

ただし、元のファイルも保持したいです。

これは可能ですか?

回答:


9
find . -type f | \
while read -r x
do
  gzip -c "$x" > "$x.gz"
done

-cstdoutに結果をプッシュし、元のみを保持します。欠点は、自分でファイルを見つける必要があることです。find(1)ただし、より洗練されたトラバースでは、上記のようにを使用できます。.現在のディレクトリから検索を開始し、-type fすべての通常ファイルの名前を返します。


なぜ*.*ls

@pooh:*.*定期的に名前が付けられたすべてのファイルに一致し、通常はディレクトリには一致しません。もちろん、ほとんどの場合にのみ機能し、通常は必要な場合には機能しません。次に、findコマンドを使用します。
ボルデウィン

@Boldewyn:質問は、ディレクトリ内のすべてのファイルをgzipすることでした。TODOのls *.*ようなファイルを選択しません。

ls必要とされていないすべてでfor x in *。ただし、使用するfind必要がありますfind . -type f | while read -r x
追って通知があるまで一時停止します。

更新された回答。-rスイッチをオンにしていただきありがとうございreadます。
ボルデウィン

5
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;

簡単に切り替えて、-name '*.txt -or -name '*.html今のように圧縮したいもの(など)を含めて、いくつかのファイル(既に圧縮されたバックアップファイルと一時ファイル)を除外することができます。

ファイル名のスペースもうまく処理します。

テスト用に変更gzipecho gzipます。または、-exec部分をすべてスキップします。

編集:ああ、私はこれが<target>.gz既に存在するかどうかをチェックしないことを言及するのを忘れました。これは問題になる場合とそうでない場合があります。

Edit2: OK、ここでは既存のファイルをチェックするものを使用します。それが必要な場合があります。ワンラインネスをご容赦ください。

while read file; do if [ ! -f "$file.gz" ]; then echo "Compressing $file"; gzip -c "$file" > "$file.gz"; else echo "Not overwriting $file.gz";  fi  done < <(find . -type f -not \( -name '*.gz' -or -name '*[~#]' \))

私のfind-fooは多分そうではありません。findで直接スキップすることは非常に可能です。


1
すべてのファイルでstatを呼び出すことを避けるために、-nameが-typeの前に来る必要があることを読んでください。

@Benは理にかなっています、良い入力です!大きな木では目立つかもしれません。
-plundra



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.