リナックス

リナックス

そこで、次のロジックに従って圧縮してグループ化したいファイルが 20,000 個ほどあります。

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

ファイルは次のようになります

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両方のファイルが含まれますが、これは本来あるべきではありません。

答え1

リナックス

これは動作するはずです:

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

さて、シェル スクリプトを単に紹介するのではなく、7zip のコンテキスト メニューを紹介します。

ステップ1: これらすべてのファイルが入っているフォルダーを開きます。

ステップ2: 「名前」をクリックすると、すべてのファイルが名前順に並べられます (これにより、名前の始まりが似ているファイルを簡単に選択できるようになります)。

ステップ3: とともにマウスボタンを押しながら、選択ボックスを 1 つのファイルに圧縮したいすべてのファイルにドラッグ アンド ドロップします (つまり、foobar(a).foo、foobar.foo、foobar(123).foo)

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

PARENT_DIRECTORYは、これらのファイルが入っているフォルダの名前です。つまり、現在いるフォルダの名前が「files」の場合、それらは「files.7z」に追加されます。

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

関連情報