find . -type f | \
while read -r x
do
gzip -c "$x" > "$x.gz"
done
-c
結果を stdout にプッシュし、オリジナルだけを保持します。欠点は、自分でファイルを見つける必要があることです。より洗練されたトラバースについては、 find(1)
を使用できます ただし、上記のように:.
現在のディレクトリから始まる検索、および -type f
すべての通常ファイルの名前を返します。
find . -type f -not \( -name '*.gz' -or -name '*[~#]' \) -exec sh -c 'gzip -c "{}" > "{}.gz"' \;
圧縮したいものを含めるように簡単に切り替えることができます ( -name '*.txt -or -name '*.html
など) 一部のファイル (既に圧縮された、バックアップおよび一時ファイル) を除外します。
ファイル名のスペースも適切に処理します。
gzip
を変更 echo gzip
まで テスト用。または、-exec 部分をすべてスキップします。
編集: あ、言い忘れましたが、これは <target>.gz
かどうかをチェックしません。 もう存在している。これは問題になる場合とそうでない場合があります。
編集 2: わかりました、ここで既存のファイルをチェックするものに行きます。それが望まれる場合。ワンライネスを許してください。
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 で直接スキップできる可能性は非常に高いでしょう。
gzip -k
オプション
gzip 1.6 (2013 年 6 月) は -k, --keep
を追加しました オプションで、次のことができるようになりました:
gzip -kr .
元のファイルは削除されません。
https://unix.stackexchange.com/questions/46786/how-to-tell-gzip-to-keep-original-file にあります