web-dev-qa-db-ja.com

類似した名前の複数のファイルを圧縮する方法は?

したがって、次のロジックで圧縮してグループ化する20000個のファイルがあります。

  • (までの同一文字を持つすべてのファイルを圧縮します
  • (がないファイルも含めます

つまり、ファイルは次のようなものです

file_123.foo
file_123(abc).foo
file_123(b9)(ca)[a1].foo

foobar(a).foo
foobar.foo
foobar(123).foo

に圧縮する必要があります

file_123.7z
foobar.7z

私はWindowsのバッチファイル、UNIXスクリプト、または任意の圧縮プログラム(そこから作業できます)を開いていますが、最も便利な組み合わせは.7zとWindowsです。

[〜#〜]更新[〜#〜]

cYrusは私に完璧な答えをくれました、問題は私の質問が十分に正確ではなかったということでした:)私が賢くなったので、これが私がまだ回避する方法を理解していない次の一連の問題です:

したがって、これが発生しない限り、すべてが完全に機能します。

file_123(abc).foo
file_123456789(b9).foo

これらの2つはグループ化しないでください。つまり、2つの別々のファイルにまとめる必要があります。

file_123.7z
file_123456789.7z

これです:

for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx*; done

これら2つを別々に作成します。しかし短いファイルはキャッチオールとして機能します。つまり、file_123.7zには両方のファイルが含まれますが、含まれるべきではありません。

2
Viritys

Linux

これは機能するはずです:

for pfx in $(for i in *.foo; do echo "${i%%[.(]*}"; done | sort -u); do 7z a "$pfx.7z" $pfx[.\(]*; done

説明

まず、入力ファイル(*.foo)全体を反復処理し、サフィックス(${i%%[.(]*})を削除して以下を取得する必要があります。

file_123
file_123
file_123
foobar
foobar
foobar

次に、sort -uを使用して重複を削除できます。

file_123
foobar

最後に、プレフィックス($pfx)ごとに、プレフィックス自体をアーカイブの名前("$pfx.7z")とファイルを識別するパターン($pfx[.\(]*)の両方として使用してアーカイブを構築できます。同等のものを取得する:

7z a file_123.7z 'file_123(abc).foo' 'file_123(b9)(ca)[a1].foo' 'file_123.foo'
7z a foobar.7z 'foobar(123).foo' 'foobar(a).foo' 'foobar.foo'
2
cYrus

さて、シェルスクリプトを提供するだけでなく、7zipのコンテキストメニューを表示します。

ステップ1:これらすべてのファイルを含むフォルダーを開きます。

ステップ2:[名前]をクリックして、すべてのファイルを名前で並べ替えます(これにより、同じような名前で始まるファイルを簡単に選択できます)。

ステップマウスボタンを使用して、1つのファイルに圧縮するすべてのファイルの上に選択ボックスをドラッグアンドドロップします(つまり、foobar(a).foo 、foobar.foo、foobar(123).foo)

ステップ4:マウスの右ボタンを離すと、コンテキストメニューが表示されます。 7Zipに移動> PARENT_DIRECTORY.7zに追加

ここで、PARENT_DIRECTORYは、これらのファイルが含まれているフォルダーの名前です。したがって、現在のフォルダーが呼び出された場合、「files」はそれらを「files.7z」に追加します。

ステップ5:新しい7Zipファイルを右クリックし、[名前の変更]をクリックして、この新しい圧縮ファイルの名前を変更します。

0
Stonestorm