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.zipfile/).

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.)