Hallo,
schraube gerade noch an den letzten Feinheiten meines Backup-Scripts und da fehlte mir noch der Generationen-Vertrag zu meinem Glück.
Dachte - so schwer kann das doch nicht sein ...
isses vielleicht aba doch.
Hier erstmal das Testscript:
#!/bin/bash
verbose=0
maxLevel=9
prefLevel='rednose.'
createDirs() {
for i in $(seq 0 $maxLevel); do
[ "x1" = "x$verbose" ] && echo " sequence #$i"
mkdir "${prefLevel}${i}" 2> /dev/null
if [ "x$i" = "x3" ]; then
for f in $(seq 0 8); do
touch "${prefLevel}${i}/Test-${i}.${f}"
done
fi
done
}
wrapDirs() {
local tmp="${prefLevel}tmp"
local num=$maxLevel
local src=0
echo "execute: mv \"${prefLevel}${maxLevel}\" \"$tmp\""
mv "${prefLevel}${maxLevel}" "$tmp"
while [ $num -gt 0 ]; do
let "src = num - 1"
echo "execute: mv \"${prefLevel}${src}\" \"${prefLevel}${num}\""
mv "${prefLevel}${src}" "${prefLevel}${num}"
let "num -= 1"
done
echo "execute: mv \"$tmp\" \"${prefLevel}0\""
mv "$tmp" "${prefLevel}0"
sync
local files=$(ls "${prefLevel}0" | wc | awk '{ print $1; }')
if [ "x0" = "x$files" ]; then
files=$(ls "${prefLevel}1" | wc | awk '{ print $1; }')
if [ "x0" = "x$files" ]; then
return
fi
ls -l "${prefLevel}1/*"
cp -al "${prefLevel}1/*" "${prefLevel}0"
fi
}
#createDirs
wrapDirs
find . | sort
Alles anzeigen
Vor dem ersten Aufruf "createDirs" auskommentieren, dann wird ne Testumgebung erstellt.
Danach wieder deaktivieren.
Jetzt soft aufrufen, bis die Testdateien in Verzeichnis 0 angekommen sind und es so aussieht:
~/test$ ./testIt
execute: mv "rednose.9" "rednose.tmp"
execute: mv "rednose.8" "rednose.9"
execute: mv "rednose.7" "rednose.8"
execute: mv "rednose.6" "rednose.7"
execute: mv "rednose.5" "rednose.6"
execute: mv "rednose.4" "rednose.5"
execute: mv "rednose.3" "rednose.4"
execute: mv "rednose.2" "rednose.3"
execute: mv "rednose.1" "rednose.2"
execute: mv "rednose.0" "rednose.1"
execute: mv "rednose.tmp" "rednose.0"
.
./testIt
./rednose.0
./rednose.0/Test-3.0
./rednose.0/Test-3.1
./rednose.0/Test-3.2
./rednose.0/Test-3.3
./rednose.0/Test-3.4
./rednose.0/Test-3.5
./rednose.0/Test-3.6
./rednose.0/Test-3.7
./rednose.0/Test-3.8
./rednose.1
./rednose.2
./rednose.3
./rednose.4
./rednose.5
./rednose.6
./rednose.7
./rednose.8
./rednose.9
Alles anzeigen
Mit dem näxten Aufruf sollte das Script eigentlich(tm) aktiv werden.
Verzeichnis 0 wird zu Verzeichnis 1 und danach sollten die Dateien ins neue (leere) Verzeichnis 0 kopiert (bzw. gelinkt) werden.
Statt dessen kommt die folgende Ausgabe:
~/test$ ./testIt
execute: mv "rednose.9" "rednose.tmp"
execute: mv "rednose.8" "rednose.9"
execute: mv "rednose.7" "rednose.8"
execute: mv "rednose.6" "rednose.7"
execute: mv "rednose.5" "rednose.6"
execute: mv "rednose.4" "rednose.5"
execute: mv "rednose.3" "rednose.4"
execute: mv "rednose.2" "rednose.3"
execute: mv "rednose.1" "rednose.2"
execute: mv "rednose.0" "rednose.1"
execute: mv "rednose.tmp" "rednose.0"
ls: Zugriff auf rednose.1/* nicht möglich: Datei oder Verzeichnis nicht gefunden
cp: Aufruf von stat für „rednose.1/*“ nicht möglich: Datei oder Verzeichnis nicht gefunden
.
./testIt
./rednose.0
./rednose.1
./rednose.1/Test-3.0
./rednose.1/Test-3.1
./rednose.1/Test-3.2
./rednose.1/Test-3.3
./rednose.1/Test-3.4
./rednose.1/Test-3.5
./rednose.1/Test-3.6
./rednose.1/Test-3.7
./rednose.1/Test-3.8
./rednose.2
./rednose.3
./rednose.4
./rednose.5
./rednose.6
./rednose.7
./rednose.8
./rednose.9
Alles anzeigen
Zeile 41 und 42 vom Script produzieren den Fehler.
Jetzt meine Frage:
Habe ich im Script einen Denkfehler, oder kommt das Problem, weil der Verzeichniscache den letzten move-Befehl nicht mitbekommen hat?
Wenn ich in Zeile 41 und 42 jeweils das "/*" wech lasse, kopiert er zwar, aber dann kopiert er den obersten Verzeichnisnamen ja auch mit rein - und das willich ja vermeiden tun ...
Gruß Gero