gzipを使用して、既存の.gzファイルを除くディレクトリ内のファイルを圧縮します


19

gzipを使用して圧縮するジョブを設定したいログのディレクトリがあります。問題は、すでに圧縮したログを再圧縮したくないということです。

を使用してみましたls | grep -v gz | gzipが、うまくいかないようです。

これを行う方法はありますか?基本的に、.gzで終わらないディレクトリ内のすべてのファイルをgzipで圧縮します。

回答:


26

あなたはただすることができます:

gzip *

gzipは、既に.gz 終了しているファイルをスキップすることを通知します。
そのメッセージが邪魔になる場合は、次を使用できます。

gzip -q *

あなたが試みたものは動作gzipしませんでした、なぜならstdinから圧縮するファイルのファイル名を読み取らないからです。

ls | grep -v gz | xargs gzip

gz末尾だけでなく、ファイル名の任意の場所にあるパターンのファイルを除外します。¹またls、スペースや改行などのファイル名がある場合、出力の解析は危険であることに注意する必要があります。

末尾のgzipファイルをスキップすることに依存しない、よりクリーンなソリューション.gzは、サブディレクトリ内の非圧縮ファイルも処理します。

find .  -type f ! -name "*.gz" -exec gzip {} \;



¹ としては、izkata次のようにコメントし使用して.gzの作業、これを改善するだけではないでしょう。grep -vF .gzまたはを使用する必要がありますgrep -v '\.gz$'ls出力を処理する危険性が残っています


1
「...これにより、ファイル名の内部部分と一致する可能性が低くなります」-grepであり、使用$すると明確になります。そして、あなたは脱出していない.、唯一というファイルを除外するために起こっているので、とにかくを開始してgz(彼らは「前に任意の文字を持っていないので、gz」)
Izkata

1
@Izkata:いいえ、エスケープされていないドットを含み、ファイル名のどこかに「gz」が続く任意の文字を含む3文字以上で構成される名前を持つすべてのファイル$を除外(-v)して、正規表現を固定しません。そのため、「gz」で始まる名前のファイルが含まれます。
追って通知があるまで一時停止します。

1
@DennisWilliamson最後のコメントは明確ではありませんでした。またgz、名前の最初の部分(開始部分を除く)のファイルも除外します。とにかくそれを固定する方が良いです。を使用し$ていない.ので、正規表現で何を意味するのか理解していないかのように読み取られるため、残りの混乱したコメントになります。
イズカタ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.