特定のモードでファイルを個別に圧縮したいです。たとえば、次のようなディレクトリがあります。
/log/log1
-/1/log2/file.1
-/1/log2/file123
-/1/log2/file2.1
/log/log2
-/2/log2/file4.1
-/2/log2/file345
-/2/log2/file3.1
/logで、拡張子が.1のすべてのファイルを繰り返し圧縮したいと思います。
結果は次のとおりです。
/log/log1
-/1/log2/file.gz
-/1/log2/file123
-/1/log2/file2.gz
/log/log2
-/2/log2/file4.gz
-/2/log2/file345
-/2/log2/file3.gz
答え1
find
+bash
解決策:
find /log -type f -name "*.1" -exec bash -c 'gzip -nc "$1" > "${1:0:-2}.gz"; rm "$1"' _ {} \;
gzip
オプション:
-n
- 圧縮時にデフォルトでは、元のファイル名とタイムスタンプは保存されません。-c
- 出力を標準出力に書き込みます。ソースファイルは変更されません。
${1:0:-2}
bash
-の一部;最後の 2 文字が切り捨てられたファイルパスを取得します。
答え2
次のことができます。
find /log -name '*.1' -type f -exec sh -c '
for file do
gzip "$file" && mv -i "$file.gz" "${file%.*}.gz"
done' sh {} +
私たちは、いくつかのメタデータを圧縮ファイルに保存し、競合をよりよく処理する機能の利点を得るためにgzip file && mv -i file.gz newfile
vs.を使用します。gzip < file > newfile && rm -f file
gzip
mv -i