
Ich habe den folgenden Code geschrieben, um ALLE VOR 2 MINUTEN ERSTELLTEN TRACE-DATEIEN IN EIN SEPARATES VERZEICHNIS ZU VERSCHIEBEN. Wenn ich jetzt den Quell- und Zielpfad im Skript fest codiere, funktioniert es einwandfrei. Wenn ich sie jedoch als Variable übergebe, erhalte ich eine Fehlermeldung. Folgendes ist mein Code:
##THIS SCRIPT WILL MOVE ALL THE TRACE FILES CREATED BEFORE 2 MINUTES TO A SEPARATE DIRECTORY
cd /home/adhikarisubir/test/basic_unix //MY TRACE_BKP.SH FILE EXISTS HERE
#TRACE_PATH=/home/adhikarisubir/test/basic_unix
#BKUP_PATH=/home/adhikarisubir/test_bkp
MINUTES=$1 #IT WILL GET THE NUMBER OF MINUTES FROM THE COMMAND LINE
TRACE_PATH=$2 #INSTEAD OF HARD-CODING TAKING PATHS AS VARIABLE
BKUP_PATH=$3 #^^
echo $MINUTES
echo $BKUP_PATH
echo $TRACE_PATH
cd $TRACE_PATH
echo $pwd
for i in `find . -cmin +$MINUTES -name "*.trc"` ##FINDING FILES WITH EXTENSTION .TRC WHICH ARE OLDER THAN GIVEN MINUTES
do
echo "Moving files $i, size `du -h $i`, which are older than $MINUTES minutes"
echo $i
mv $i $BKUP_PATH
done
Ich führe den Code wie folgt aus:
adhikarisubir@ubuntu:~/test/basic_unix$ sh trace_bkp.sh 2 home/adhikarisubir/test/basic_unix home/adhikarisubir/test_bkp
Die Fehlerausgabe lautet:
2
home/adhikarisubir/test_bkp
home/adhikarisubir/test/basic_unix
trace_bkp.sh: 11: cd: can't cd to home/adhikarisubir/test/basic_unix
Moving files ./elnc.trc, size 0 ./elnc.trc, which are older than 2 minutes
./elnc.trc
mv: cannot move ‘./elnc.trc’ to ‘home/adhikarisubir/test_bkp’: No such file or directory
Moving files ./ph.trc, size 0 ./ph.trc, which are older than 2 minutes
./ph.trc
mv: cannot move ‘./ph.trc’ to ‘home/adhikarisubir/test_bkp’: No such file or directory
Antwort1
Eine Neufassung:
#!/bin/bash
minutes=$1
trace_path=$2
bkup_path=$3
if [[ ! -d "$trace_path" ]]; then
echo "Error: trace_path '$trace_path' is not a directory" >&2
exit 1
fi
if [[ ! -d "$bkup_path" ]]; then
echo "Error: bkup_path '$bkup_path' is not a directory" >&2
exit 1
fi
echo "Moving files which are older than $minutes minutes"
find "$trace_path" -cmin +"$minutes" -name "*.trc" -exec mv -v -t "$bkup_path" '{}' \+
Anmerkungen:
- du brauchst
cd
nirgendwohin- Wenn Sie das Verzeichnis in das Verzeichnis des Skripts ändern möchten, gehen Sie wie folgt vor:
cd "$(dirname "$0")"
- Wenn Sie das Verzeichnis in das Verzeichnis des Skripts ändern möchten, gehen Sie wie folgt vor:
- immer in Anführungszeichen setzen,
"$variables"
es sei denn, Sie wissen genau, wann Sie die Anführungszeichen weglassen müssen - benutze keine UPPER_CASE_VARS: eines Tages wirst duversehentlich schreiben
PATH=foo
und sich dann wundern, warum Ihr Skript kaputt ist - Benutzereingaben validieren
find
kann mit den gefundenen Dateien etwas anfangen.mv
hat Optionen, überprüfen Sie die Manpage