Jak utworzyć osobne pliki zip dla każdego wybranego pliku / katalogu w 7zip?

30

Oto wewnętrzny paker zip Total Commander:

Obraz okna dialogowego pakera zip Total Commander.

Chcę jednak użyć mojego pakera 7zip. Kiedy wybieram 5 plików, otrzymuję 5 osobnych archiwów .zip dla każdego wybranego pliku. Jak to zrobić w 7zip?

Grumpy ol 'Bear
źródło

Odpowiedzi:

54

Nie jestem pewien, czy możesz zrobić to, co sugerujesz za pomocą graficznego interfejsu użytkownika, ale z pewnością możesz to zrobić z wiersza poleceń:

FOR %i IN (*.*) DO 7z.exe a "%~ni.7z" "%i"

Najpierw musisz zmienić katalog ( cdpolecenie) na F:\Downloadskatalog lub inny katalog, w którym chcesz przeprowadzić masową kompresję. Ponadto łatwo jest zastąpić plik * .exe lub dowolne rozszerzenie, które chcesz filtrować, aby po prostu skompresować te dokumenty.

I sekretny dzwonek dekodera:

  • %i jest zmienną, która przechowuje nazwę pliku dla każdego kroku w pętli
  • (*.*) to kryteria wyboru, może to być plik * .exe lub podobny
  • 7z.exe to wersja 7-Zip w wierszu poleceń
  • %~ni - powoduje to rozszerzenie zmiennej% i tylko do nazwy pliku - bez rozszerzenia

Jeśli chcesz tylko dodać foldery dla danego katalogu, polecenie jest nieco bardziej złożone, ponieważ domyślnie FOR działa tylko z plikami. Musimy podać kilka dodatkowych informacji:

FOR /F "usebackq delims=?" %i IN (`DIR /B /A:D`) DO 7z.exe a "%i.7z" "%i"

Działa to z powodu kilku elementów, które wydają się magiczne:

  • /F mówi FOR, aby iterować po rozszerzonej wartości w ()
  • usebackq mówi ZA, że przekażę polecenie i użyję danych wyjściowych do iteracji
  • delims=?mówi ZA, że chcę rozdzielić tokeny na ?- niedozwolony znak w nazwach plików i katalogach. Chcę tylko jednego tokena.
  • /BW DIRjest dla formatu gołej - tylko nazwa
  • /A:DW DIRto na ograniczenie wyniki według atrybutu, że D jest dla katalogów

Jeśli chcesz umieścić to w pliku wsadowym, jedyną zmianą, którą musisz wprowadzić, jest podwójne wyjście ze zmiennej% i:

FOR %%i IN (*.*) DO 7z.exe a "%%~ni.7z" "%%i"
Goyuix
źródło
Tak, z wyjątkiem twojego archiwum 7z, chcę archiwum zip! Więc zamiast tego% ~ ni.zip?
Grumpy ol 'Bear
Jeszcze lepiej, chcę zip lub 7z z ultra kompresją. I zapakuj go d: \ zapakowane. Ale jak dotąd twoja metoda działa!
Grumpy ol 'Bear
1
Mam to. Dziękuję! DLA% i IN ( . ) DO 7z.exe a „i: \ pack \% ~ ni.7z" "% i" -mx9
Grumpy ol 'Bear
Przy okazji, możesz mi pokazać, jak to zrobić w pliku wsadowym? tj. sperate-archive.bat
Grumpy ol 'Bear
Dzięki i jak mogę dodać całe foldery do tego skryptu, proszę?
Grumpy ol 'Bear
15

Podoba mi się odpowiedź Goyuixa. Jeśli jednak używasz systemu Windows 7 (lub masz zainstalowany Power Shell), a także używasz wersji 7-zip 7za.exe z linii poleceń, możesz uruchomić to polecenie:

dir | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }

Możesz także zmienić „katalog” na „katalog * .exe”, aby wybrać tylko pliki wykonywalne.

Jedną fajną rzeczą w Power Shell jest to, że pracujesz z obiektami zamiast z łańcuchami. Więc możesz być naprawdę konkretny, jeśli chcesz. Na przykład:

dir *.csv | ? { $_.Length -lt 18900 -and $_.LastWriteTime -ge [DateTime] "07/01/2011" } | ForEach-Object { & "7za.exe" a $_.BaseName $_.Name }

Dotyczy to tylko plików, które:

  1. mieć rozszerzenie csv
  2. mniej niż 18,900 bajtów
  3. ostatnio zmodyfikowany w dniu 7/1/2011

EDYCJA Jeśli chcesz pliki zip zamiast 7-zip, użyj zip.exe InfoZip .

jftuga
źródło
4
7-zip może również tworzyć pliki zip - spójrz na flagę -t. Przykład:7z a -tzip archive.zip *.exe
Goyuix
Ok, $ _. BaseName $ _. Nazwa działa, ale jak to zrobić $ _. BaseName $ _. Nazwa na innym dysku, w innym katalogu? Powiedz f: \ test \ plik1.7z itd.
Grumpy ol 'Bear
0

Możesz pobrać i zainstalować wtyczkę 7zip dla Total Commander ze strony http://www.ghisler.com/plugins.htm Po wykonaniu tej czynności po prawej stronie okna na zrzucie ekranu pojawi się kolejny wybór kompresji 7zip. Dzięki tej opcji możesz osiągnąć dokładnie to, o co prosisz.

Mxx
źródło
0

Właśnie pracowałem nad tym problemem i jednym z problemów, które znalazłem, było powielenie nazwy folderu w archiwum, tj. Podczas kompresji folderu o nazwie „foo” .\foo\fighters.txttworzone jest archiwum zawierające zamiast jednego zawierającego fighters.txt.

Dlatego odpowiedzią jest przejście do przetwarzanego katalogu i wyświetlenie archiwum w poprzednim (głównym) katalogu, a następnie powrót do tego katalogu w celu przetworzenia następnego folderu.

Ważne jest również, aby program 7ZIP zignorował istniejące pliki ZIP i CMD w katalogu głównym, aby zapobiec ich przedostaniu się do archiwum, stąd argumenty -x!*.zipi -x!*.cmdwykluczenia.

Ten skrypt zachowa również rekurencyjne struktury folderów.

@echo off

REM Ensures variables set within the batch file are local to
REM this script only and will be removed when finished.
setlocal

if exist *.zip goto zip_exist

for /d %%X in (*) do (
    cls
    cd /D %%X
    "e:\Program Files\7-Zip\7z.exe" a -r  -x!*.zip -x!*.cmd "..\%%X.zip" "*.*"
    cd ..
)
goto end

:zip_exist
Echo.
Echo Note: for this script to work, compression of
Echo pre-existing zip files is not possible.

:end
pause

Powyższy kod należy skopiować do pliku wsadowego, takiego jak „katalog_kompresyjny. Cmd” i uruchomić jako administrator z katalogu zawierającego foldery, które chcesz skompresować.

Mam nadzieję że to pomoże.

Pi Hard
źródło
0

Jeśli chcesz zachować strukturę folderów i zapisać każdy plik we własnej strukturze, spróbuj tego:

Zapisz to polecenie w pliku z rozszerzeniem .bat i umieść w folderze, który chcesz skompresować:

FOR /R %%i IN (*.*) DO "C:\Program Files\7-Zip\7z.exe" a "%%i.7z" "%%i" -sdel

Uwaga:

-sdel: usuwa oryginalny plik (opcjonalnie, jeśli chcesz zachować tylko skompresowany plik)

żywa miłość
źródło