
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.7z
incluye 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'.