linux

linux

Tengo unos 20 000 archivos que quiero comprimir y agrupar siguiendo la lógica siguiente:

  • comprimir todos los archivos que tengan caracteres idénticos hasta(
  • También incluye archivos que no tienen(

Entonces los archivos son como

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

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

que debe comprimirse a

file_123.7z
foobar.7z

Estoy abierto a archivos por lotes de Windows, scripts de Unix o cualquier programa de compresión (puedo trabajar desde allí), aunque la combinación más conveniente sería .7z y Windows.

ACTUALIZAR

cYrus me dio una respuesta perfecta, el problema fue que mi pregunta no era lo suficientemente precisa :) Ahora que soy más inteligente, aquí está el siguiente conjunto de problemas que aún no he descubierto cómo solucionar:

Entonces todo funciona perfectamente a menos que suceda esto:

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

Esos dos no deberían agruparse, es decir, deberían terminar en dos archivos separados:

file_123.7z
file_123456789.7z

Éste:

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

crea esos dos por separado,peroel archivo más corto funciona como un comodín, es decir, file_123.7zincluye ambos archivos, lo cual no debería ser así.

Respuesta1

linux

Esto debería funcionar:

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

Explicación

Primero tenemos que iterar sobre todos los archivos de entrada ( *.foo) y quitar el sufijo ( ${i%%[.(]*}) obteniendo:

file_123
file_123
file_123
foobar
foobar
foobar

Luego podemos eliminar duplicados con sort -u:

file_123
foobar

Finalmente, para cada prefijo ( $pfx) podemos construir el archivo usando el prefijo mismo como nombre del archivo ( "$pfx.7z") y el patrón para identificar los archivos ( $pfx[.\(]*); obteniendo el equivalente a:

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'

Respuesta2

Bien, en lugar de simplemente darte un script de shell, te mostraré el menú contextual de 7zips.

Paso 1: Abra su carpeta con todos estos archivos.

Paso 2: Haga clic en "Nombre" para ordenar todos los archivos por su nombre (esto facilitará la selección de archivos con inicios de nombres similares).

Paso 3: Con elbienbotón del mouse, arrastre y suelte el cuadro de selección sobre todos los archivos que desea comprimir en un solo archivo (entonces, foobar(a).foo, foobar.foo, foobar(123).foo).

Etapa 4: Al soltar el botón derecho del ratón, aparecerá el menú contextual. Vaya a 7Zip > Agregar a PARENT_DIRECTORY.7z

Donde PARENT_DIRECTORY es el nombre de la carpeta en la que se encuentran estos archivos. Entonces, si la carpeta en la que se encuentra se llama "archivos", los agregará a "archivos.7z".

Paso 5: Cambie el nombre de este nuevo archivo comprimido haciendo clic derecho en el nuevo archivo 7Zip y haciendo clic en 'Cambiar nombre'.

información relacionada