後で元のファイルを削除せずに、サブディレクトリ内のすべてのファイルを含む、dir内のすべてのファイルを個別にgzipする必要があります。index.htmlがあるとします。最後にindex.html.gzipとindex.htmlが必要です。
私は私のディレクトリ内のすべてのファイルをgzipすることができます
gzip -r .
ただし、元のファイルも保持したいです。
これは可能ですか?
後で元のファイルを削除せずに、サブディレクトリ内のすべてのファイルを含む、dir内のすべてのファイルを個別にgzipする必要があります。index.htmlがあるとします。最後にindex.html.gzipとindex.htmlが必要です。
私は私のディレクトリ内のすべてのファイルをgzipすることができます
gzip -r .
ただし、元のファイルも保持したいです。
これは可能ですか?
回答:
find . -type f | \
while read -r x
do
gzip -c "$x" > "$x.gz"
done
-c
stdoutに結果をプッシュし、元のみを保持します。欠点は、自分でファイルを見つける必要があることです。find(1)
ただし、より洗練されたトラバースでは、上記のようにを使用できます。.
現在のディレクトリから検索を開始し、-type f
すべての通常ファイルの名前を返します。
*.*
定期的に名前が付けられたすべてのファイルに一致し、通常はディレクトリには一致しません。もちろん、ほとんどの場合にのみ機能し、通常は必要な場合には機能しません。次に、find
コマンドを使用します。
ls
必要とされていないすべてで:for x in *
。ただし、使用するfind
必要がありますfind . -type f | while read -r x
。
-r
スイッチをオンにしていただきありがとうございread
ます。
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
既に存在するかどうかをチェックしないことを言及するのを忘れました。これは問題になる場合とそうでない場合があります。
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で直接スキップすることは非常に可能です。
gzip 1.6(2013年6月)は-k, --keep
オプションを追加したため、次のことが可能になりました。
gzip -kr .
gzip -rc `ls` > archive.gz
Debianでテスト済み(gzip 1.3.12-6)
ls
不要*
です。
*.*
中ls
?