Find files in sub-directories and unpack them in place

I have a lot of zip and rar archives in various sub-directories, which I wanted to extract but to leave the files in their sub-directories.

I have used for a long time this command to search for files and extract them in working directory:

find ./ -iname "*.zip" -print0 | xargs -0 -I {} 7z -y x {}

Which works OK if you want your files all to be extracted to the directory where you started the find command. But to leave files in their own folder this command was not appropriate.

It seems that find command has this neat flag called “-execdir” which does exacty that what I wanted, so here are few examples:

Find all zip files in sub-directories and unzip them in place using unzip:

find ./ -iname "*.zip" -execdir unzip -o '{}' ';'

Find all rar files in subdirectories and unzip them in place using unrar:

find ./ -iname "*.rar" -execdir unrar e '{}' ';'

The same using 7zip would look like:

find ./ -iname "*.zip" -execdir 7z -y x '{}' ';'


find ./ -iname "*.rar" -execdir 7z -y x '{}' ';'

Later on if you want to delete your zip and rar files and only leave the contents you can use similar command from where I have started.

For example to delete all rar archives that are named .rar, r00, r01 … r0x you can use:

find ./ -iname "*.r??" -print0 | xargs -0 -I {} rm {}

and similar you can can use to delete zip files, but please make sure that you don’t have zip files in your zip archives that you do not want to delete:

find ./ -iname "*.zip" -print0 | xargs -0 -I {} rm {}

Bash zip all files in directory one by one in individual zips

If you like me have for example folder filled with NES rom files that end with .nes extension and you would like to zip them all up in individual files to save some space.

I use this one-liner to zip all my NES collection so that it will take less space on my USB stick when I transfer it to my bartop arcade running RetroPie:

for file in *.nes ; do zip "$" "$file"; done

Continue reading “Bash zip all files in directory one by one in individual zips”