複数のファイルを別々のアーカイブに圧縮するにはどうすればよいですか?

複数のファイルを別々のアーカイブに圧縮するにはどうすればよいですか?

この質問は以前にもここで尋ねられたことを認めます:

のように別々のファイルに圧縮する質問者は使用している OS を指定しなかったため、回答が得られませんでした。

巨大なディレクトリを、相互に依存しない複数の .zip ファイルに分割する必要があります。そのため、次の代わりに:

ファイル1.zip
ファイル2.z01
ファイル3.z02

代わりに次のファイルセットを希望します:

ファイル1.zip
ファイル2.zip
ファイル3.zip

基本的にこれが私の質問です。私は OS X を使用しているので、シェル スクリプトまたは AppleScript を使用するのが最も簡単な方法です。

さらに、同じことを質問した人がいます。ただし、.tarアーカイブを作成したいだけです。ファイルセットごとに個別のアーカイブを作成する

答えは正しいですが、tar ファイルが生成されます。

for file in `ls *`; do tar -czvf $file.tar.gz $file ; done

PS: この最後の部分は、Keyboard Maestro に慣れている人向けです。

また、Keyboard Maestro でもこれを実行しようとしました。ファイル パスを決定し、シェル スクリプトをトリガーする「for each」アクション設定があります。出力は正しく、マクロをターミナルに貼り付けると機能します (例zip /Users/me/Desktop/test /Users/me/Desktop/test.txt)。

ただし、Keyboard Maestro のシェル スクリプトに 2 つの変数を渡すと、機能しません。
zip "$KMVAR_zipPath" "$KMVAR_sourcePath"

答え1

解決法は非常に簡単です。すべてのファイルに対してこれを再帰的に実行したい場合は、 を使用しますfind。これにより、サブディレクトリも含めてすべてのファイルとディレクトリが一覧表示されます。

find . -type f -execdir zip '{}.zip' '{}' \;

説明:

  • 最初の引数は開始したいディレクトリです。.
  • 次に、ファイルのみを検索するように制限します(-type f
  • この-execdirオプションを使用すると、見つかった各ファイルに対してコマンドを実行し、ファイルのディレクトリから実行することができます。
  • このコマンドは として評価されますzip file.txt.zip file.txt。たとえば、 のすべての出現が{}実際のファイル名に置き換えられます。このコマンドは で終了する必要があります。\;

もちろん、find他にもオプションがあります。代わりに、サブディレクトリに降りずに現在のディレクトリに留まりたい場合は、次のようにします。

find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;

特定のファイル タイプに制限する場合は、-nameオプション (または-iname大文字と小文字を区別しない一致の場合) を使用します。

find . -type f -name "*.txt" …

それ以外のもの (forの出力を でループすることを含むls *) は、私の意見では非常に醜い構文であり、たとえばファイル名にスペースが含まれていたり、引数が多すぎたりすると、壊れる可能性があります。

関連情報