79 lines
1.8 KiB
Nix
79 lines
1.8 KiB
Nix
{ pkgs }:
|
|
|
|
pkgs.writeShellScriptBin "extract" ''
|
|
set -euo pipefail
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[0;33m'
|
|
NC='\033[0m'
|
|
|
|
log_info() { echo -e "''${GREEN}[INFO]''${NC} $1"; }
|
|
log_warn() { echo -e "''${YELLOW}[WARN]''${NC} $1"; }
|
|
log_error() { echo -e "''${RED}[ERROR]''${NC} $1"; }
|
|
|
|
usage() {
|
|
echo "Usage: $0 <archive1> [archive2] ..."
|
|
echo "Extracts zip and 7z files into folders named after the archive."
|
|
exit 1
|
|
}
|
|
|
|
extract_file() {
|
|
local archive="$1"
|
|
local archive_name
|
|
local output_dir
|
|
local extension
|
|
|
|
if [[ ! -f "$archive" ]]; then
|
|
log_error "File not found: $archive"
|
|
return 1
|
|
fi
|
|
|
|
archive_name=$(${pkgs.coreutils}/bin/basename "$archive")
|
|
extension="''${archive_name##*.}"
|
|
extension="''${extension,,}"
|
|
|
|
if [[ "$extension" != "zip" && "$extension" != "7z" ]]; then
|
|
log_error "Unsupported file type: $archive (only .zip and .7z supported)"
|
|
return 1
|
|
fi
|
|
|
|
output_dir="''${archive%.*}"
|
|
${pkgs.coreutils}/bin/mkdir -p "$output_dir"
|
|
|
|
log_info "Extracting: $archive -> $output_dir/"
|
|
|
|
if ${pkgs.p7zip}/bin/7z x "$archive" -o"$output_dir" -y >/dev/null 2>&1; then
|
|
log_info "Successfully extracted with 7zip: $archive"
|
|
return 0
|
|
fi
|
|
|
|
log_warn "7zip failed for: $archive"
|
|
|
|
if [[ "$extension" == "zip" ]]; then
|
|
if ${pkgs.unzip}/bin/unzip -o "$archive" -d "$output_dir" >/dev/null 2>&1; then
|
|
log_info "Successfully extracted with unzip: $archive"
|
|
return 0
|
|
fi
|
|
log_error "unzip also failed for: $archive"
|
|
return 1
|
|
fi
|
|
|
|
log_error "Failed to extract: $archive"
|
|
return 1
|
|
}
|
|
|
|
if [[ $# -eq 0 ]]; then
|
|
usage
|
|
fi
|
|
|
|
exit_code=0
|
|
|
|
for archive in "$@"; do
|
|
if ! extract_file "$archive"; then
|
|
exit_code=1
|
|
fi
|
|
done
|
|
|
|
exit $exit_code
|
|
''
|