個々のファイルを見つけて圧縮し、元のファイルを削除します。

個々のファイルを見つけて圧縮し、元のファイルを削除します。

.txt多くの個々のファイルを含むディレクトリを作成しましょう。私の目的は、ディレクトリ内の個々のファイルを見つけ、同じ名前(.txtを除く)で個別に圧縮し、元のファイルを削除することです。

gzip以下のように使いやすいです。

find .* -type f | xargs gzip 

しかし、ファイルを圧縮する必要があります。

注:sudo権限はありません。

ベストアンサー1

考慮する:

$ ls -1
a.txt
b.txt
c.txt
d.jpg

次のコマンドは、各.txtファイルを圧縮して元のファイルを削除します。

find . -maxdepth 1 -type f -name '*.txt' -exec zip -Tm {}.zip {} \;
 

結果:

$ ls -1
a.txt.zip
b.txt.zip
c.txt.zip
d.jpg

メモ:入力ファイルを削除する前にアーカイブの整合性をテストするためにこのオプションを使用します-T。オプションzipのマニュアルページでは、以下を提案します-m

-m, --move
指定されたファイルをzipアーカイブに移動します。実際、これは指定されたzipアーカイブを作成した後にターゲットディレクトリ/ファイルを削除します。ファイルを削除した後にディレクトリが空の場合、そのディレクトリも削除されます。 zipがエラーなしでアーカイブを生成するまで、削除は行われません。これはディスク容量を節約するのに役立ちますが、潜在的に危険である可能性があるため、-Tすべての入力ファイルを削除する前にテストアーカイブで使用することをお勧めします。

この.txt部分はまだファイル名に存在します。これはgzip行動する方法でもあります。

この部分を削除するには.txt:

.txtその部分をファイル名に保持したくない場合は、次のコマンドを使用してこれを達成できます。

find . -maxdepth 1 -name '*.txt' -type f -exec bash -c \
  'zip -Tm "${1%.*}".zip "$1"' inline-bash {} \;

結果:

$ ls -1
a.zip
b.zip
c.zip
d.jpg

メモ:find上記のコマンドで呼び出された述語の順序は、名前がパターンと一致しないファイルに適用されるのを防ぎます-type f(高価なシステムコールを含めることができます)。 (lstat()*.txt引用する)

メモ:inline-bashこれをインラインスクリプトの最初の引数として提供します。これには2つの利点があります。

  1. $0インラインスクリプトではに設定されますinline-bash(これを覚えておいてください)。"$0 はシェルまたはシェルスクリプトの名前に展開されます。" —バッシュマニュアル-c.)、using、または同様の機能を使用して実行されるインラインスクリプトの場合、inline-bashこの目的に論理的で他の一般的なオプションを選択した場合よりも意味のあるエラーメッセージを生成します_
  2. スクリプトの位置パラメータは、通常どおり1から始まります。

インラインスクリプトに0番目の引数とそれを呼び出す方法を提供します。に関する記事検索の使用(mywiki.wooledge.org)そして回答:Stéphane Chazelasこの問題についてfind -exec sh -c使っても安全ですか?

おすすめ記事