web-dev-qa-db-ja.com

複数のファイルを別々のアーカイブに圧縮する方法は?

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

のように 別々のファイルに圧縮 質問した人が使用したOSを指定せず、回答を受け取っていません。

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

file1.Zip
file2.z01
file3.z02

代わりに、次のファイルセットが必要です。

file1.Zip
file2.Zip
file3.Zip

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

さらに、同じことを尋ねた人がいます-彼だけが.tarアーカイブを作成したかったのです:方法 ファイルのセットに対して別々のアーカイブを作成する

答えは正しいですが、tarファイルになります。

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

PS:この最後の部分は、KeyboardMaestroに慣れている人のためのものです。

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

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

5
patrick

解決策は非常に簡単です。すべてのファイルに対してこれを再帰的に実行する場合は、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" …

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

15
slhck