18

I have a bunch of files like this:

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

I just want to know how to keep the folder structure while archiving. This is more important than the duplicate thing, to know how to solve that, would be a bonus.

@Lamb "Do you want to archive only selective files (not the whole folder content) from the G1 and G2 folders?"

That almost says it all, but I'll try to improve: Not only do I want to move only some selected files to an archive. I also have a list of these files, including path-names to each file.

So, in SubDir1 there might be 10 files, of which I want to zip three, and in SubDir1\sub2 there might be five files, of which I want to zip all five. The files that I need to archive are in a listfile.

There might be duplicate files, so my hope is that with subdirectories added, 7-Zip does NOT see them as duplicates.

And I like to do it on the command line.

I've tried a batch file like this:

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

This also means that files 01antique-shop.mp3, 02antique-shop.mp3, ...., til 33antique-shop.mp3 and 34antique-shop.mp3, should NOT be archived.

The foldernames (=subdirectories) weren't added to MyArchive.7z, and this is the problem.

Obviously, I'd like to use just one commando with a listfile, but that doesn't work either.

I've tried:

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

which actually works pretty fine as far as the selecting goes, but it does NOT keep the directory structure. Sadly.

How do I do this?

1
  • Do you want to archive only selective files (not the whole folder content) from the G1 and G2 folders ?
    – Ankit
    Feb 2, 2013 at 16:45

6 Answers 6

15

The latest stable version of 7-Zip (15.14) has the switch -spf that enables the absolute path storage.

For example, if the file list.txt is

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

the command 7z a p.7z -spf @list.txt will produce an archive storing the absolute paths as is in the list. Alternatively, the command 7z a p.7z -spf2 @list.txt will remove the drive letter:

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

If the file list.txt is

dir1\file.txt
dir2\file.txt

the command 7z a p.7z @list.txt will store the relative paths as is in the list, in both versions 9.20 and 15.14.

I did more tests with the switch -spf. The results are here.

0
10

I got it to archive a directory with subdirectories using the following:

7z.exe a - t7z NewArchivePath PathOfFolderToArchive
7
  • I can't find a direct link to the 7zA.exe anywhere (as per your link), is it obsolete and replaced by 7z.exe? Feb 2, 2013 at 18:26
  • @user194767: 7za.exe is the command-line version.
    – Karan
    Feb 2, 2013 at 19:50
  • and, I'd like to use it, but I can't find a like to it on that page, 7-zip.org/download.html. So, just to be clear: with "can't find a direct link to the 7zA.exe anywhere" I really meant: "Please give me a direct link to this free software!" Thank you! Feb 2, 2013 at 20:34
  • 1
    @user194767: Ok, here's the current version, but are you telling me you couldn't spot 7-Zip Command Line Version anywhere on that page?!
    – Karan
    Feb 2, 2013 at 20:51
  • I couldn't 7zA.exe so tried using 7z.exe and it worked. I'm not sure what the -r flag is used for but it is not needed to archive subdirectories.
    – Eric Roper
    Feb 2, 2013 at 21:55
7

Try this instead:

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

The problem seems to be that people have been requesting for years for proper path storage options (just as they have for the ability to modify multi-volume archives), but the author doesn't seem to be interested. That's part of the reason why I started using WinRAR so much.


If you have a listfile, 7-Zip will not store paths if the files to be archived do not share a single top-level directory. For example if you have Input.txt containing the following:

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

If you run 7z a MyArchive.7z @Input.txt, you'll see that the paths have been stripped completely, which seems completely backwards to me (OTOH rar a MyArchive.rar @Input.txt does the job just fine).

So to overcome 7-Zip's deficiency, you can use a batch file as follows:

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

Note: Replace D:\MyArchive.7z with the proper path to your destination archive. Also, the batch file should work irrespective of whether you have quoted paths in your listfile or not.


Edit: If your listfile looks like:

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

or

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

then edit it to look like this instead:

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

Now assuming all files to be archived are under C:\$$-edrive, navigate to C:\ and run 7z a C:\MyArchive.7z @C:\Input.txt. Using a listfile the paths will be saved only if no drive letters are present, no initial backslashes are there and if the top-level (root) directory is the same for all files. Also, for best results I advise you not to create MyArchive.7z in C:\$$-edrive.

14
  • Well, the answer was 3/4 ok. RAR worked super,but batch file worked soso. Here's the output, and it only added ONE file to my archive, the one without spaces in the filename___ C:\Programs\zippers\7-Zip>( pushd "C:\ c:\Programs\zippers\7-Zip\7z.exe a c:\$$-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 Scanning Updating archive c:\$$-edrive\FGH.7z Error: Can not open file FGH.7z.tmp Access denied. System error: undefined error===== Most important is perhaps the access denied error? Feb 3, 2013 at 2:04
  • Can you add a few sample lines (with spaces and without) from your actual listfile to your question above?
    – Karan
    Feb 3, 2013 at 2:14
  • okay, so I replaced all the spaces with dots in the filenames, but not in the pathnames, which I will try now. output is still: C:\Programs\zippers\7-Zip>(______ pushd c:_______ c:\Programs\zippers\7-Zip\7z.exe a c:\$$-edrive\FGH.7z "$$-edrive\F\filmmusic_14mp3_foretean\starcraft.-.starcraft.vs.south.park.mp3"_______ popd________ )________ Scanning Updating archive c:\$$-edrive\FGH.7z Error: Can not open file FGH.7z.tmp Access denied. System error: undefined error Feb 3, 2013 at 2:28
  • "I replaced all the spaces with dots in the filenames" - Meaning you renamed the actual files, or just edited the listfile? Spaces in both filenames and paths should be fine, see my edit above (i.e. from your listfile remove C:\ and place quotes around all paths). Now you should be able to use 7z directly instead of my batch file workaround.
    – Karan
    Feb 3, 2013 at 2:34
  • 1. I renamed both = = = = = = 2. I've made your changes, but it still doesn't work with 7z = = = = = =3. $$-edrive\ is indeed the only top directory. = = = = = 4. Error messages = = = = = WARNINGS for files: = = = = = $$-edrive : The system can't find that file. = = = = = = = = = = "$$-edrive : The system can't find that file. = = = = = = = = = = WARNING: Cannot find 2 files = = = = = C:\Programs\zippers\7-Zip> = = = = = note that there are two warnings, and the second one starts with one double quote... Odd? Feb 3, 2013 at 2:51
0

7-Zip will see them as duplicates regardless, and skip them. If there's any way to get around that, I've never found it - I always just break the job up into several archives.

2
  • do you know how to KEEP the folder structure while zipping files INTO an archive? They say that's the default, but it's NOT. Feb 2, 2013 at 10:01
  • @user194767 - I use a command line like this: %ZDIR%\7z a -t7z -r -mx=1 %ZIP%\mydocu "c:\My Documents\*.*" -wc:\temp where ZDIR is the path to 7-Zip and ZIP is the destination drive.
    – MT_Head
    Feb 2, 2013 at 18:12
0

Not sure how to help with duplicates. However, I think a more convenient system than a batch with a full command per would be to create a 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

And then compress them all with 7z a -r -tzip archive.zip @listfile.txt

0

I have created a bat script to use with 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

Then in totalcmd create a shortcut for it: enter image description here

Then when you want to zip some files/folders and preserve folder structure relative to %TOP_DIR% you just select the files needed (somewhere inside %TOP_DIR%) and press the button.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.