![Finden Sie heraus, ob die Datei komprimiert ist oder nicht](https://rvso.com/image/38697/Finden%20Sie%20heraus%2C%20ob%20die%20Datei%20komprimiert%20ist%20oder%20nicht.png)
Ich muss herausfinden, ob die Datei im Skript komprimiert ist oder nicht. Wenn sie komprimiert ist, muss ich sie uncompress
als senden attachement
. Mein Suchbefehl ergibt zwei Dateien sum12.pdf.Z
und sum23.pdf.Z
mein Skript ist
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]
als ich dieses Skript ausführte, erhielt ich einen Fehler wie
${file: -1}: 0403-011 The specified substitution is not valid for this command.
Ich benutze ksh
.
Antwort1
Das Dateinamenssuffix nach dem letzten Punkt kann mit angegeben werden ${file##*.}
.
In diesem Fall würde ich allerdings in Erwägung ziehen, die Dekomprimierung und die UUencoding-Datei find -exec
direkt wie folgt durchzuführen:
#!/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 {} +
Auf diese Weise würden Sie Pfadnamen mit Leerzeichen und anderen problematischen Zeichen unterstützen. Das sh -c
Skript speichert die unkomprimierten Dateien auch nicht, sondern dekomprimiert sie, uuencodiert sie und sendet sie in einem Durchgang.
Ich habe auch die Handhabung gzip
komprimierter Dateien hinzugefügt.
Verwandt:
- Die Option -exec von „find“ verstehen
- Warum ist es eine schlechte Praxis, die Ausgabe von „find“ zu durchlaufen?
Alternative Implementierung des sh -c
Skripts mit case ... esac
anstelle mehrerer if
„and elif
“-Anweisungen.
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 {} +