I have a bit of an odd one that I can’t seem to figure out.
Here’s the setup. I am downloading a bunch of files given to a script via array. The files are not necessarily in the same folder, so I don’t think just using cd to change directory and then add the files I want is going to work.
I have added -j to my shell command in order to not include the directories, and it worked… kinda. Now I have all the files in the top level of the zip, but it’s also included the directories and duplicate versions of the files in the appropriate directories.
Any thoughts?
Edit: code added.
I have an array of files like this:
Images
--image1.jpg
--image2.jpg
Other images
--image3.jpg
--image4.jpg
Other folderAnother subfolderWhy so many folders
--image5.jpg
So what I’d like is to have all the images in the root of the zip, but what I’m getting is both directories and junked directories in one zip:
Zip
--Images
--image1.jpg
--image2.jpg
--Other images
--image3.jpg
--image4.jpg
--Other folder
--Another subfolder
--Why so many folders
--image5.jpg
--image6.jpg
--image1.jpg
--image2.jpg
--image3.jpg
--image4.jpg
--image5.jpg
--image6.jpg
My code is quite simple, I’m using -j to strip out the directory and passing an array of files to zip. If I remove the -j, it only includes a single copy of the files, although in the folders, so I know the issue is not my array doubling up on the files.
zip -jq zip array_of_files
Edit Solved. Kind of.
For some reason when I placed the -j at the end of the command line, it works as expected. Unsure why that would matter, but it fixed it. Here’s what worked.
zip zipname array_of_files -jq
Advertisement
Answer
You can use a combination of find
and zip
together. Run the above command at the same level as the individual folders.
find . -type f -name "*.jpg" -print | zip -jq myfile.zip -@
The find command lists the jpg
files from he current path and with the -@
option in zip
is to read from stdin
which the previous command produces. And the -jq
flag for junk paths.
With the above command, I was able to achieve the structure as you intended. Use unzip -l
to list the files under the archive without extraction.
$ unzip -l myfile.zip
Archive: myfile.zip
Length Date Time Name
-------- ---- ---- ----
0 11-26-16 13:08 image1.jpg
0 11-26-16 13:09 image2.jpg
0 11-26-16 13:09 image3.jpg
0 11-26-16 13:09 image4.jpg
-------- -------
0 4 files
The above simulation of mine is for your original input, when you had 4 images in total.