buttonMASTER
asked on
Unix commands to unzip a bunch of zip files scattered in folders (and other requirements)?
I need to extract a bunch of zip files, but I have requirements.
The zip files are scattered in various folder like this
I want to extract the files to another folder and keep the same folder structure
I want to extract everything in the zip file except for files that have certain extensions
Is this possible with a few Unix commands? If it isn't entirely possible, what is the closest I can do?
The zip files are scattered in various folder like this
- base_folder/
- base_folder/batch_1/batch_
1_1.zip - base_folder/batch_1/batch_
1_2.zip - base_folder/batch_2/batch_
2_1.zip - base_folder/batch_2/batch_
2_2.zip - base_folder/batch_2/batch_
2_1.zip - base_folder/big_batch/batc
h_a/batch_ a_1.zip - base_folder/big_batch/batc
h_a/batch_ a_2.zip - base_folder/big_batch/batc
h_b/batch_ b.zip
I want to extract the files to another folder and keep the same folder structure
- base_folder/extracted/
- base_folder/extracted/batc
h_1/file_1 - base_folder/extracted/batc
h_1/file_2 - base_folder/extracted/batc
h_2/file_2 _1 - base_folder/extracted/batc
h_2/file_2 _2 - base_folder/extracted/batc
h_2/file_2 _1 - base_folder/extracted/big_
batch/batc h_a/file_a _1 - base_folder/extracted/big_
batch/batc h_a/file_a _2 - base_folder/extracted/big_
batch/batc h_b/file_b
I want to extract everything in the zip file except for files that have certain extensions
- file - OK
- file.exe - OK
- file.xml - OK
- file.txt - Not OK
- file.xls - Not OK
Is this possible with a few Unix commands? If it isn't entirely possible, what is the closest I can do?
ASKER
Hi noci. Thank you for your quick reply.
I added what you said in a script file and cleaned it up a little because it looked like it had some syntax errors.
And it looks like it almost works, but I get one error like the one below for all the zip files.
Do you know how I can fix that?
I added what you said in a script file and cleaned it up a little because it looked like it had some syntax errors.
for i in $( find base_folder ! -path '*/extracted*' -a -name '*.zip' -print ) ; do
out=$( dirname $i | sed 's/base_name/base_name\/extracted/' )
[ -d $out ] || sudo mkdir -p $out
(cd $o ; sudo unzip $i '*' -x '*.txt' '*.xls')
done
And it looks like it almost works, but I get one error like the one below for all the zip files.
unzip: cannot find or open base_folder/batch_1/batch_1_1.zip, base_folder/batch_1/batch_1_1.zip.zip or base_folder/batch_1/batch_1_1.zip.ZIP.
Do you know how I can fix that?
That requires a absolute path in the find command.....
so find /where/ever/is/the/base_fo lder ...
in stead of find base_folder...
or:
so find /where/ever/is/the/base_fo
in stead of find base_folder...
or:
for i in $( find $PWD/base_folder ! -path '*/extracted*' -a -name '*.zip' -print ) ; do
out=$( dirname $i | sed 's/base_name/base_name\/extracted/' )
[ -d $out ] || sudo mkdir -p $out
(cd $o ; sudo unzip $i '*' -x '*.txt' '*.xls')
done
ASKER
Ok almost there. So it was able to extract everything, but I don't know where it extracted to.... It seems like it extracted it somewhere and extracted all the contents into the same folder. I know this because to test this, I put copies of the same zip file in the nested folders and was prompted to replace all the files.
Do you know whats going on?
Do you know whats going on?
Bummer... there is a typo $o used as output..., in stead of $out...
This should show the location:....
Sorry for that.
And this should be the right code:
This should show the location:....
for i in $( find $PWD/base_folder ! -path '*/extracted*' -a -name '*.zip' -print ) ; do
out=$( dirname $i | sed 's/base_name/base_name\/extracted/' )
[ -d $out ] || sudo mkdir -p $out
(cd $o ; echo $o)
done
if this only show blank lines then the unzip is probably done on the original directory. (from where the commands are started)Sorry for that.
And this should be the right code:
for i in $( find $PWD/base_folder ! -path '*/extracted*' -a -name '*.zip' -print ) ; do
out=$( dirname $i | sed 's/base_name/base_name\/extracted/' )
[ -d $out ] || sudo mkdir -p $out
(cd $out ; sudo unzip $i '*' -x '*.txt' '*.xls')
done
ASKER
Ok it worked! But one more thing I'm sorry, I didn't realize I example was incorrect.
How would I modify the code to have the contents of the zip extract to a folder named the same thing as the zip file (minus the extension)?
so:
base_folder/batch_1/batch_1_1.zip -> base_folder/extracted/batc h_1/batch_1_1/file_1
How would I modify the code to have the contents of the zip extract to a folder named the same thing as the zip file (minus the extension)?
so:
base_folder/batch_1/batch_1_1.zip -> base_folder/extracted/batc
ASKER CERTIFIED SOLUTION
membership
Create a free account to see this answer
Signing up is free and takes 30 seconds. No credit card required.
ASKER
It looks like it extracted the files to the folder the zip files were in and not the 'extracted' directory.
That was because $o was empty, cd without any path returns you to the login directory ($HOME) of an account.
or nowhere if that is empty as well (stays where you are).
or nowhere if that is empty as well (stays where you are).
ASKER
Thank you noci. I was able to fix it by changing:
out=$( dirname $i)/$( basename $i .zip| sed 's/base_name/base_name\/ex tracted/' )
to:
out=$( dirname $i | sed 's/base_name/base_name\/ex tracted/') /$(basenam e $i .zip)
out=$( dirname $i)/$( basename $i .zip| sed 's/base_name/base_name\/ex
to:
out=$( dirname $i | sed 's/base_name/base_name\/ex
Open in new window
You may need more -x options. of you want to forbid more files.