#!/bin/bash
find . -type f -name '*.zip' -print0 | while read -d $'\0' file
do
# skip loop iteration if file no longer exists
if [[ ! -f "$file" ]] ; then continue; fi
#echo "$file"
unzip -t -qq "$file"
RETVAL=$?
# return values (error codes) are generally unique to each archive tool
case $RETVAL in
# 0=success, archive file is okay
0)
echo "OK: $file"
;;
# codes that indicate a broken archive
3)
echo "BROKEN($RETVAL): $file"
mv "$file" "$file.broken"
;;
# codes that indicate file is not a supported archive
9)
echo "WRONGFORMAT($RETVAL): $file"
mv "$file" "$file.wrongformat"
;;
# user pressed ctrl-C or break or killed the process
80)
echo "USER ABORT: $file"
;;
# codes that indicate an encrypted archive
81)
echo "ENCRYPTED($RETVAL): $file"
mv "$file" "$file.encrypted"
;;
# codes that indicate a password-protected archive
82)
echo "PASSWORD($RETVAL): $file"
mv "$file" "$file.password"
;;
# other error codes
*)
echo "ERROR($RETVAL): $file"
;;
esac
doneSame script, but changed to handle RAR files. The error codes are defined as an enum in "errhnd.hpp". An approximate list is:
SUCCESS=0, WARNING=1, FATAL_ERROR=2, CRC_ERROR=3, LOCK_ERROR=4, WRITE_ERROR=5, OPEN_ERROR=6, USER_ERROR=7, MEMORY_ERROR=8, CREATE_ERROR=9, NO_FILES_ERROR=10, USER_BREAK=255
Code 3 is commonly returned if files within the RAR archive have errors. Code 10 may indicate that the RAR archive is not actually a RAR file (it might be a misnamed ZIP or 7Z archive).
#!/bin/bash
find . -type f -name '*.rar' -print0 | while read -d $'\0' file
do
# skip loop iteration if file no longer exists
if [[ ! -f "$file" ]] ; then continue; fi
#echo "$file"
unrar t -idq "$file"
RETVAL=$?
case $RETVAL in
# 0=success, archive file is okay
0)
echo "OK: $file"
;;
# codes that indicate a broken archive
3)
echo "BROKEN($RETVAL): $file"
mv "$file" "$file.broken"
;;
# probably indicates wrong format (ZIP or 7Z file as RAR)
10)
echo "WRONGFORMAT($RETVAL): $file"
mv "$file" "$file.wrongformat"
;;
# user pressed ctrl-C or break or killed the process
255)
echo "USER ABORT: $file"
;;
# other errors
*)
echo "ERROR($RETVAL): $file"
;;
esac
doneBoth scripts work fine under Cygwin, but in order to get "unrar" for Cygwin you will have to download the UnRar portable source from RARLabs.
As a final note, here the script to undo the name change, for cases where the script doesn't work as expected. It searches for any files ending in '.broken' and strips that portion of the file name back off. This can be used for other mass-renaming activities with minor edits. It may be useful to change sed to use ':' as the delimiter instead of '/' (i.e. sed 's:.broken$::g') to make things easier to write.
#!/bin/bash
find . -type f -name '*.broken' -print0 | while read -d $'\0' file
do
# skip loop if file no longer exists
if [[ ! -f "$file" ]] ; then continue; fi
#echo "$file"
NEWF=$(echo "$file" | sed 's/.broken$//g')
mv "$file" "$NEWF"
done