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

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

.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使っても安全ですか?

答え2

男性の場合:

  -m
   --move
          Move  the  specified  files  into the zip archive; actually, this deletes the target directories/files after making the specified zip archive. If a directory
          becomes empty after removal of the files, the directory is also removed. No deletions are done until zip has created the archive without error.  This is use-
          ful  for  conserving  disk  space, but is potentially dangerous so it is recommended to use it in combination with -T to test the archive before removing all
          input files.

現在のディレクトリのAnnファイルを圧縮します。

zip -m test.zip *.txt

努力するこれ

for i in *.txt; 
do
  zip -m "${i%.*}.zip" "${i%.*}".*; 
done

上記のコードは、forループから拡張子が.txtのすべてのファイルを取得し、プレフィックス名を使用して各ファイルを圧縮します。

関連情報