Unzip All Files In | Subfolders Linux
Use find to locate archives robustly:
find /path/to/root -type f -iname '*.zip'
find /path/to/root -type f -iname '*.zip' -print0
Task: Unzip all .zip files under /data/incoming into folders named after each ZIP (e.g., file.zip → file/).
cd /data/incoming
find . -name "*.zip" -type f -exec sh -c '
base="$0%.zip"
mkdir -p "$base"
unzip -q "$0" -d "$base"
' {} \;
To avoid conflicts, create a directory for each archive: unzip all files in subfolders linux
find /path/to/root -type f -iname '*.zip' -print0 | while IFS= read -r -d '' zip; do
dir="$(dirname "$zip")"
base="$(basename "$zip" .zip)"
dest="$dir/$base"
mkdir -p "$dest"
unzip -q "$zip" -d "$dest"
done
While unzip is standard, other utilities offer recursive extraction features natively.
Some files may have a .zip extension but not be valid zip files. Use file command to verify: Use find to locate archives robustly:
find . -name "*.zip" -exec file {} \;
If you prefer clarity over brevity:
find . -name "*.zip" -type f | while read -r zipfile; do
target_dir=$(dirname "$zipfile")
unzip -o "$zipfile" -d "$target_dir"
done
Note: This simple loop breaks if filenames contain newlines. For production scripts, use the -print0 and while IFS= read -r -d '' pattern: find /path/to/root -type f -iname '*
find . -name "*.zip" -type f -print0 | while IFS= read -r -d '' zipfile; do
unzip -o "$zipfile" -d "$(dirname "$zipfile")"
done
unzip -p "$zip" > /tmp/_tmpfile && cmp -s /tmp/_tmpfile "$target" || mv /tmp/_tmpfile "$target"
(Adapt as needed; this is more complex and costly.)