Jak zarchiwizować podkatalogi za pomocą wiersza polecenia 7-Zip? Lub jak ZACHOWAĆ strukturę folderów podczas archiwizacji?

16

Mam kilka takich plików:

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

Chcę tylko wiedzieć, jak zachować strukturę folderów podczas archiwizacji. Jest to ważniejsze niż zduplikowanie, aby wiedzieć, jak to rozwiązać, byłby bonus.

@Lamb „Czy chcesz archiwizować tylko wybrane pliki (a nie całą zawartość folderu) z folderów G1 i G2?”

To prawie wszystko mówi, ale postaram się poprawić: nie tylko chcę przenieść tylko niektóre wybrane pliki do archiwum. Mam również listę tych plików, w tym nazwy ścieżek do każdego pliku.

Tak więc w SubDir1 może być 10 plików, z których chcę spakować trzy, a w SubDir1 \ sub2 może być pięć plików, z których chcę spakować wszystkie pięć. Pliki, które muszę zarchiwizować, znajdują się w pliku list.

Mogą istnieć zduplikowane pliki, więc mam nadzieję, że z dodanymi podkatalogami, 7-Zip NIE widzi ich jako duplikatów.

I lubię to robić w wierszu poleceń.

Próbowałem pliku wsadowego takiego:

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

Oznacza to również, że pliki 01antique-shop.mp3, 02antique-shop.mp3, ...., do 33antique-shop.mp3 i 34antique-shop.mp3, NIE powinny być archiwizowane.

Nazwy folderów (= podkatalogi) nie zostały dodane do MyArchive.7z i to jest problem.

Oczywiście chciałbym użyć tylko jednego komanda z plikiem listy, ale to też nie działa.

Próbowałem:

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

co faktycznie działa całkiem dobrze, jeśli chodzi o wybieranie, ale NIE zachowuje struktury katalogów. Niestety

Jak mam to zrobic?

PrincessPooleRulz
źródło
Czy chcesz archiwizować tylko wybrane pliki (a nie całą zawartość folderu) z folderów G1 i G2?
Ankit

Odpowiedzi:

12

Najnowsza stabilna wersja 7-Zip (15.14) ma przełącznik -spf, który umożliwia przechowywanie absolutnej ścieżki.

Na przykład, jeśli plik list.txt to

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

polecenie 7z a p.7z -spf @list.txtutworzy archiwum przechowujące ścieżki bezwzględne takie, jak na liście. Alternatywnie polecenie 7z a p.7z -spf2 @list.txtusunie literę dysku:

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

Jeśli plik list.txt to

dir1\file.txt
dir2\file.txt

polecenie 7z a p.7z @list.txtzapisze ścieżki względne takie, jakie są na liście, w obu wersjach 9.20 i 15.14.

Zrobiłem więcej testów z przełącznikiem -spf. Wyniki są tutaj .

Marco
źródło
Przez cały dzień szukałem tego pomysłu. dzięki !
Mosze L
9

Mam go do zarchiwizowania katalogu z podkatalogami przy użyciu :

7z.exe a - t7z NewArchivePath PathOfFolderToArchive
Eric Roper
źródło
Nie mogę nigdzie znaleźć bezpośredniego łącza do pliku 7zA.exe (zgodnie z linkiem), czy jest on przestarzały i zastąpiony plikiem 7z.exe?
PrincessPooleRulz
@ user194767: 7za.exe jest wersją wiersza polecenia .
Karan
i chciałbym go użyć, ale nie mogę znaleźć podobnego na tej stronie, 7-zip.org/download.html. Tak więc, dla jasności: „nie mogę nigdzie znaleźć bezpośredniego łącza do 7zA.exe”. Naprawdę miałem na myśli: „Proszę dać mi bezpośredni link do tego darmowego oprogramowania!” Dziękuję Ci!
PrincessPooleRulz
1
@ user194767: Ok, oto aktualna wersja, ale czy mówisz mi, że nie możesz znaleźć wersji 7-Zip w wierszu poleceń nigdzie na tej stronie ?!
Karan
Nie mogłem 7zA.exe, więc spróbowałem użyć 7z.exe i zadziałało. Nie jestem pewien, do czego służy flaga -r, ale nie jest konieczne archiwizowanie podkatalogów.
Eric Roper
7

Spróbuj zamiast tego:

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

Problem wydaje się być to, że ludzie zostali prośbą do lat dla odpowiednich opcji przechowywania ścieżka (tak samo jak oni mają na możliwość modyfikowania archiwa wieloczęściowe ), ale autor nie wydaje się być zainteresowany. To jeden z powodów, dla których tak często zacząłem używać WinRAR.


Jeśli masz plik list, 7-Zip nie będzie przechowywać ścieżek, jeśli pliki przeznaczone do archiwizacji nie współużytkują jednego katalogu najwyższego poziomu. Na przykład jeśli masz plik Input.txt zawierający następujące elementy:

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

Jeśli uruchomisz 7z a MyArchive.7z @Input.txt, zobaczysz, że ścieżki zostały całkowicie rozebrane, co wydaje mi się całkowicie odwrócone (OTOH dobrze rar a MyArchive.rar @Input.txtsobie z tym radzi).

Aby przezwyciężyć niedobór 7-Zip, możesz użyć pliku wsadowego w następujący sposób:

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

Uwaga: Zastąp D:\MyArchive.7zwłaściwą ścieżkę do docelowego archiwum. Ponadto plik wsadowy powinien działać niezależnie od tego, czy zacytowałeś ścieżki w pliku listy, czy nie.


Edycja: Jeśli Twój plik listy wygląda następująco:

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

lub

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

następnie edytuj go, aby wyglądał następująco:

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

Teraz zakładając, że wszystkie pliki do zarchiwizowania są poniżej C:\$$-edrive, przejdź do C: \ i uruchom 7z a C:\MyArchive.7z @C:\Input.txt. Korzystając z pliku listy, ścieżki zostaną zapisane tylko wtedy, gdy nie ma liter dysku, nie ma początkowych ukośników odwrotnych i jeśli katalog najwyższego poziomu (root) jest taki sam dla wszystkich plików. Ponadto, aby uzyskać najlepsze wyniki, odradzam tworzenie MyArchive.7z w C: \ $$ - edrive.

Karan
źródło
Odpowiedź była w porządku 3/4. RAR działał super, ale plik wsadowy działał soso. Oto wynik i dodałem tylko JEDEN plik do mojego archiwum, ten bez spacji w nazwie pliku___ C: \ Programs \ zippers \ 7-Zip> (pushd "C: \ c: \ Programs \ 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 Skanowanie Aktualizowanie archiwum c: \ $$ - edrive \ FGH.7z Błąd: Nie można otworzyć pliku FGH.7z.tmp Odmowa dostępu. Błąd systemu: błąd niezdefiniowany ===== Najważniejszy jest może błąd odmowy dostępu?
PrincessPooleRulz
Czy możesz dodać kilka przykładowych wierszy (ze spacjami i bez) z rzeczywistego pliku listy do powyższego pytania?
Karan
dobrze, więc zastąpiłem wszystkie spacje kropkami w nazwach plików, ale nie w nazwach ścieżek, które spróbuję teraz. dane wyjściowe są nadal: C: \ Programs \ zippers \ 7-Zip> (______ pushd c: _______ c: \ Programs \ zippers \ 7-Zip \ 7z.exe ac: \ $$ - edrive \ FGH.7z "$$ - edrive \ F \ filmmusic_14mp3_foretean \ starcraft .-. starcraft.vs.south.park.mp3 "_______ popd________) ________ Skanowanie Aktualizowanie archiwum c: \ $$ - edrive \ FGH.7z Błąd: Nie można otworzyć pliku FGH.7z.tmp Access odmówiono. Błąd systemu: błąd nieokreślony
PrincessPooleRulz
„Zamieniłem wszystkie spacje na kropki w nazwach plików” - co oznacza, że ​​zmieniłeś nazwy rzeczywistych plików lub po prostu edytowałeś plik listy? Spacje zarówno w nazwach plików, jak i ścieżkach powinny być w porządku, patrz moja edycja powyżej (tj. Z pliku listy usuń C: \ i umieść cudzysłowy wokół wszystkich ścieżek). Teraz powinno być możliwe bezpośrednie użycie 7z zamiast mojego obejścia pliku wsadowego.
Karan
1. Zmieniłem nazwę oba = = = = = = 2. Wprowadziłem zmiany, ale nadal nie działa z 7z = = = = = = 3. $$ - edrive \ jest rzeczywiście jedynym najwyższym katalogiem. = = = = = 4. Komunikaty o błędach = = = = = OSTRZEŻENIA dotyczące plików: = = = = = $$ - edrive: System nie może znaleźć tego pliku. = = = = = = = = = = = "$$ - edrive: System nie może znaleźć tego pliku. = = = = = = = = = = OSTRZEŻENIE: Nie można znaleźć 2 plików = = = = = C: \ Programy \ zippers \ 7-Zip> = = = = = zwróć uwagę, że są dwa ostrzeżenia, a drugie zaczyna się od jednego podwójnego cudzysłowu ... Dziwne?
PrincessPooleRulz
0

7-Zip zobaczy je niezależnie od siebie jako duplikaty i pominie je. Jeśli jest jakiś sposób na obejście tego, nigdy go nie znalazłem - zawsze po prostu dzielę pracę na kilka archiwów.

MT_Head
źródło
Czy wiesz, jak ZACHOWAĆ strukturę folderów podczas kompresowania plików do archiwum? Mówią, że to jest domyślne, ale NIE jest.
PrincessPooleRulz
@ user194767 - Używam takiego wiersza polecenia: %ZDIR%\7z a -t7z -r -mx=1 %ZIP%\mydocu "c:\My Documents\*.*" -wc:\tempgdzie ZDIRjest ścieżka do 7-Zip i ZIPjest dyskiem docelowym.
MT_Head
0

Nie wiesz, jak pomóc z duplikatami. Myślę jednak, że wygodniejszym systemem niż partia z pełną komendą dla każdego byłoby utworzenie pliku listfile.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

A następnie skompresuj je wszystkie za pomocą 7z a -r -tzip archive.zip @listfile.txt

Cosinus
źródło
0

Stworzyłem skrypt nietoperza do użycia z 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

Następnie w sumie cmd utwórz dla niego skrót: wprowadź opis zdjęcia tutaj

Następnie, jeśli chcesz skompresować niektóre pliki / foldery i zachować strukturę folderów względem %TOP_DIR%siebie, po prostu wybierz potrzebne pliki (gdzieś w środku %TOP_DIR%) i naciśnij przycisk.

grabantot
źródło