.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つの利点があります。
$0
インラインスクリプトではに設定されますinline-bash
(これを覚えておいてください)。"$0 はシェルまたはシェルスクリプトの名前に展開されます。" —バッシュマニュアル-c
.)、using、または同様の機能を使用して実行されるインラインスクリプトの場合、inline-bash
この目的に論理的で他の一般的なオプションを選択した場合よりも意味のあるエラーメッセージを生成します_
。- スクリプトの位置パラメータは、通常どおり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のすべてのファイルを取得し、プレフィックス名を使用して各ファイルを圧縮します。