![Encuentra si el archivo está comprimido o no](https://rvso.com/image/38697/Encuentra%20si%20el%20archivo%20est%C3%A1%20comprimido%20o%20no.png)
Necesito saber si el archivo está comprimido o no en un script. Si está comprimido, necesito uncompress
enviarlo como attachement
. Mi comando de búsqueda da como resultado dos archivos sum12.pdf.Z
y sum23.pdf.Z
mi script es
dir=/home/as1234/bills
cd $dir
for file in `find . -ctime -1 -type f -name "Sum*pdf*"`
do
if [ ${file: -1} == "Z" ]; then
echo "$file is Zipped"
uncompress $file
uuencode $file
fi
done
uuencode $file $file | mailx -s "subject" [email protected]
cuando ejecuté este script recibí un error como
${file: -1}: 0403-011 The specified substitution is not valid for this command.
Estoy usando ksh
.
Respuesta1
El sufijo del nombre de archivo después del punto final puede tener ${file##*.}
.
Sin embargo, en este caso, consideraría descomprimir y codificar find -exec
directamente de esta manera:
#!/bin/sh
dir=/home/as1234/bills
find "$dir" -type f -ctime -1 -name "Sum*.pdf*" -exec sh -c '
for pathname do
filename=$( basename "${pathname%.pdf*}.pdf" )
if [ "${pathname##*.}" = "Z" ]; then
uncompress -c "$pathname"
elif [ "${pathname##*.}" = "gz" ]; then
gzip -cd "$pathname"
else
cat "$pathname"
fi |
uuencode "$filename" |
mailx -s "subject ($filename)" [email protected]
done' sh {} +
De esta manera, admitirá nombres de rutas con espacios y otros caracteres problemáticos. El sh -c
script tampoco almacena los archivos descomprimidos, sino que los descomprime, los codifica y los envía de una sola vez.
También agregué manejo de gzip
archivos comprimidos.
Relacionado:
Implementación alternativa del sh -c
script usando case ... esac
en lugar de múltiples declaraciones if
y .elif
find "$dir" -type f -ctime -1 -name "Sum*.pdf*" -exec sh -c '
for pathname do
filename=$( basename "${pathname%.pdf*}.pdf" )
case $pathname in
*.Z) uncompress -c "$pathname" ;;
*.gz) gzip -cd "$pathname" ;;
*) cat "$pathname"
esac |
uuencode "$filename" |
mailx -s "subject ($filename)" [email protected]
done' sh {} +