¿Cómo archivo con subdirectorios usando la línea de comando 7-Zip? ¿O cómo MANTENGO la estructura de carpetas mientras archivo?

12

Tengo un montón de archivos como este:

C:\G\G1\35antique-shop.mp3
C:\G\G2\35antique-shop.mp3
C:\G\G1\09saguri.mp3
C:\G\G2\09saguri.mp3

Solo quiero saber cómo mantener la estructura de carpetas mientras se archiva. Esto es más importante que la cosa duplicada, saber cómo resolver eso sería una ventaja.

@Lamb "¿Desea archivar solo archivos selectivos (no todo el contenido de la carpeta) de las carpetas G1 y G2?"

Eso casi lo dice todo, pero intentaré mejorar: no solo quiero mover solo algunos archivos seleccionados a un archivo. También tengo una lista de estos archivos, incluidos los nombres de ruta a cada archivo.

Entonces, en SubDir1 puede haber 10 archivos, de los cuales quiero comprimir tres, y en SubDir1 \ sub2 puede haber cinco archivos, de los cuales quiero comprimir los cinco. Los archivos que necesito archivar están en un archivo de lista.

Puede haber archivos duplicados, así que espero que con subdirectorios agregados, 7-Zip NO los vea como duplicados.

Y me gusta hacerlo en la línea de comando.

He probado un archivo por lotes como este:

7z a -r MyArchive.7z C:\G\G1\35antique-shop.mp3
7z a -r MyArchive.7z C:\G\G2\35antique-shop.mp3
7z a -r MyArchive.7z C:\G\G1\09saguri.mp3
7z a -r MyArchive.7z C:\G\G2\09saguri.mp3

Esto también significa que los archivos 01antique-shop.mp3, 02antique-shop.mp3, ...., hasta 33antique-shop.mp3 y 34antique-shop.mp3, NO deben archivarse.

Los nombres de carpeta (= subdirectorios) no se agregaron a MyArchive.7z, y este es el problema.

Obviamente, me gustaría usar solo un comando con un archivo de lista, pero eso tampoco funciona.

He intentado:

7z a -mx0 -tzip C:\$$-edrive\F-G-H.zip @fgh.txt

que en realidad funciona bastante bien en lo que respecta a la selección, pero NO mantiene la estructura del directorio. Tristemente.

¿Cómo hago esto?

PrincessPooleRulz
fuente
¿Desea archivar solo archivos selectivos (no todo el contenido de la carpeta) de las carpetas G1 y G2?
Ankit

Respuestas:

10

La última versión estable de 7-Zip (15.14) tiene el conmutador -spf que permite el almacenamiento de ruta absoluta.

Por ejemplo, si el archivo list.txt es

C:\tmp\dir1\file.txt
C:\tmp\dir2\file.txt

el comando 7z a p.7z -spf @list.txtproducirá un archivo que almacena las rutas absolutas tal como están en la lista. Alternativamente, el comando 7z a p.7z -spf2 @list.txteliminará la letra de unidad:

tmp\dir1\file.txt
tmp\dir2\file.txt

Si el archivo list.txt es

dir1\file.txt
dir2\file.txt

El comando 7z a p.7z @list.txtalmacenará las rutas relativas tal como están en la lista, en ambas versiones 9.20 y 15.14.

Hice más pruebas con el modificador -spf. Los resultados están aquí .

Marco
fuente
Estaba buscando esta idea por un día. Gracias !
Moshe L
9

Lo conseguí para archivar un directorio con subdirectorios usando lo siguiente :

7z.exe a - t7z NewArchivePath PathOfFolderToArchive
Eric Roper
fuente
No puedo encontrar un enlace directo al 7zA.exe en ninguna parte (según su enlace), ¿está obsoleto y reemplazado por 7z.exe?
PrincessPooleRulz
@ user194767: 7za.exe es la versión de línea de comandos .
Karan
y me gustaría usarlo, pero no puedo encontrar un me gusta en esa página, 7-zip.org/download.html. Entonces, para ser claros: con "no puedo encontrar un enlace directo al 7zA.exe en ninguna parte" , realmente quise decir: "¡Por favor, deme un enlace directo a este software gratuito!" ¡Gracias!
PrincessPooleRulz
1
@ user194767: Ok, aquí está la versión actual, pero ¿me estás diciendo que no pudiste detectar la versión de línea de comando 7-Zip en ninguna parte de esa página?
Karan
No pude 7zA.exe, así que intenté usar 7z.exe y funcionó. No estoy seguro de para qué se usa el indicador -r, pero no es necesario para archivar subdirectorios.
Eric Roper
7

Intenta esto en su lugar:

cd /d C:\
7z a MyArchive.7z G\G1\35antique-shop.mp3
7z a MyArchive.7z G\G2\35antique-shop.mp3
7z a MyArchive.7z G\G1\09saguri.mp3
7z a MyArchive.7z G\G2\09saguri.mp3

El problema parece ser que las personas han estado solicitando durante años opciones de almacenamiento de ruta adecuadas (tal como lo han hecho para poder modificar archivos de varios volúmenes ), pero el autor no parece estar interesado. Esa es parte de la razón por la que comencé a usar WinRAR tanto.


Si tiene un archivo de lista, 7-Zip no almacenará rutas si los archivos a archivar no comparten un solo directorio de nivel superior. Por ejemplo, si tiene Input.txt que contiene lo siguiente:

C:\path to\file1.ext
D:\path to\file1.ext
E:\path to\file1.ext

Si corres 7z a MyArchive.7z @Input.txt, verás que los caminos se han eliminado por completo, lo que me parece completamente al revés (OTOH rar a MyArchive.rar @Input.txthace el trabajo bien).

Entonces, para superar la deficiencia de 7-Zip, puede usar un archivo por lotes de la siguiente manera:

for /f "tokens=1* delims=\" %%i in (Input.txt) do (
    pushd %%i\
    7z a D:\MyArchive.7z "%%j"
    popd
)

Nota: Reemplace D:\MyArchive.7zcon la ruta adecuada a su archivo de destino. Además, el archivo por lotes debería funcionar independientemente de si ha citado rutas en su archivo de lista o no.


Editar: si su archivo de lista se ve así:

"C:\$$-edrive\F\faithless.-.long.way.mp3"
"C:\$$-edrive\G\Antique Shop.mp3"

o

"\$$-edrive\F\faithless.-.long.way.mp3"
"\$$-edrive\G\Antique Shop.mp3"

luego edítelo para que se vea así:

"$$-edrive\F\faithless.-.long.way.mp3"
"$$-edrive\G\Antique Shop.mp3"

Ahora suponiendo que todos los archivos a archivar estén debajo C:\$$-edrive, navegue a C: \ y ejecútelo 7z a C:\MyArchive.7z @C:\Input.txt. Usando un archivo de lista, las rutas se guardarán solo si no hay letras de unidad, no hay barras diagonales iniciales y si el directorio de nivel superior (raíz) es el mismo para todos los archivos. Además, para obtener los mejores resultados, le aconsejo que no cree MyArchive.7z en C: \ $$ - edrive.

Karan
fuente
Bueno, la respuesta fue 3/4 ok. RAR funcionó súper, pero el archivo por lotes funcionó soso. Aquí está la salida, y solo agregó UN archivo a mi archivo, el que no tiene espacios en el nombre de archivo___ C: \ Programas \ zippers \ 7-Zip> (pushd "C: \ c: \ Programas \ zippers \ 7-Zip \ 7z .exe ac: \ $$ - edrive \ FGH.7z "$$ - edrive \ G \ gattaca_7mp 3_zefen \ gattaca - 03 the one moment.mp3" "popd) 7-Zip 4.65 Copyright (c) 1999-2009 Igor Pavlov 2009 Escaneo Actualizando archivo c: \ $$ - edrive \ FGH.7z Error: No se puede abrir el archivo FGH.7z.tmp Acceso denegado. Error del sistema: error indefinido ===== ¿Lo más importante es quizás el error de acceso denegado?
PrincessPooleRulz
¿Puede agregar algunas líneas de muestra (con espacios y sin ellas) de su archivo de lista real a su pregunta anterior?
Karan
bien, así que reemplacé todos los espacios con puntos en los nombres de archivo, pero no en los nombres de ruta, lo que intentaré ahora. la salida sigue siendo: C: \ Programas \ zippers \ 7-Zip> (______ pushd c: _______ c: \ Programas \ zippers \ 7-Zip \ 7z.exe ac: \ $$ - edrive \ FGH.7z "$$ - edrive \ F \ filmmusic_14mp3_foretean \ starcraft .-. starcraft.vs.south.park.mp3 "_______ popd________) ________ Análisis Actualizando el archivo c: \ $$ - edrive \ FGH.7z Error: No se puede abrir el archivo FGH.7z.tmp Acceso negado Error del sistema: error indefinido
PrincessPooleRulz
"Reemplacé todos los espacios con puntos en los nombres de archivo" - ¿Significa que cambiaste el nombre de los archivos reales o simplemente editaste el archivo de lista? Los espacios en los nombres de archivo y las rutas deben estar bien, consulte mi edición anterior (es decir, de su archivo de lista, elimine C: \ y coloque comillas alrededor de todas las rutas). Ahora debería poder usar 7z directamente en lugar de mi solución alternativa de archivos por lotes.
Karan
1. Cambié el nombre de ambos = = = = = = 2. Realicé los cambios, pero aún no funciona con 7z = = = = = = 3. $$ - edrive \ es de hecho el único directorio superior. = = = = = 4. Mensajes de error = = = = = ADVERTENCIAS para archivos: = = = = = $$ - edrive: El sistema no puede encontrar ese archivo. = = = = = = = = = = "$$ - edrive: El sistema no puede encontrar ese archivo. = = = = = = = = = = ADVERTENCIA: No puede encontrar 2 archivos = = = = = C: \ Programas \ zippers \ 7-Zip> = = = = = tenga en cuenta que hay dos advertencias, y la segunda comienza con una cita doble ... ¿Extraño?
PrincessPooleRulz
0

7-Zip los verá como duplicados independientemente y los omitirá. Si hay alguna forma de evitarlo, nunca lo he encontrado, siempre divido el trabajo en varios archivos.

MT_Head
fuente
¿sabe cómo MANTENER la estructura de carpetas mientras comprime archivos en un archivo? Dicen que ese es el valor predeterminado, pero NO.
PrincessPooleRulz
@ user194767: utilizo una línea de comando como esta: %ZDIR%\7z a -t7z -r -mx=1 %ZIP%\mydocu "c:\My Documents\*.*" -wc:\tempdónde ZDIRestá la ruta a 7-Zip y ZIPes la unidad de destino.
MT_Head
0

No estoy seguro de cómo ayudar con los duplicados. Sin embargo, creo que un sistema más conveniente que un lote con un comando completo sería crear un archivo de lista.txt:

 C:\G\G1\35antique-shop.mp3
 C:\G\G2\35antique-shop.mp3
 MyArchive.7z C:\G\G1\09saguri.mp3
 MyArchive.7z C:\G\G2\09saguri.mp3

Y luego comprimirlos a todos con 7z a -r -tzip archive.zip @listfile.txt

Coseno
fuente
0

He creado un script de murciélago para usar con totalcmd "tot-zip.bat":

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

set "TOP_DIR="D:\Grabovsky""
set "archname="%TOP_DIR%\arch.zip""
set "filelist= "
cd %TOP_DIR%
for %%A in (%*) do (
    set ondisk_path="%%~dpnxA"
    set inarch_path=!ondisk_path:%TOP_DIR%\=!
    echo Putting !ondisk_path! to !inarch_path!.
    set "filelist=!filelist! !inarch_path!"
)
echo filelist: %filelist%

7z.exe a -tzip %archname% %filelist% > NUL
pause

Luego, en totalcmd, cree un acceso directo para él: ingrese la descripción de la imagen aquí

Luego, cuando desee comprimir algunos archivos / carpetas y preservar la estructura de carpetas en relación con %TOP_DIR%usted, simplemente seleccione los archivos necesarios (en algún lugar dentro %TOP_DIR%) y presione el botón.

grabantot
fuente