Hier ist eine Alternative zu Joseph Rs Drehbuch, das keine der Einschränkungen enthält! Es wird ein numerisches Suffix an einen Pfadnamen angehängt (der Pfad kann ein Verzeichnis oder eine Datei sein), wobei der Suffixwert erhöht wird, bis einer gefunden wird, der noch nicht vorhanden ist. Andere Dienstprogramme verwenden beispielsweise logrotate
ein ähnliches Muster, drehen jedoch alle vorhandenen Kopien so, dass die neue immer '0' für ein Suffix hat. Da dies in diesem Sinne keine Rotation ist, werde ich es nennen dotmv
. Denken Sie daran, dass file.0
dies die älteste Kopie sein wird.
Zum Beispiel:
dotmv somefile.txt
Benennt um somefile.txt
somefile.txt.0
, sofern letzteres nicht vorhanden ist. In diesem Fall ist dies der Fall somefile.txt.1
und so weiter. Sie können mehr als eine Datei ( dotmv this that "the other thing"
usw.) auflisten, alle werden punktverschoben.
Ich glaube, dies ist POSIX-konform - es läuft mit set -o posix
on bash (aber das ist ein zweifelhafter Test). Ich habe auch mit der Android (Jelly Bean 4.2.1) Shell getestet und es funktioniert dort. Unter Android müssen Sie jedoch den Shebang wie angegeben ändern oder ausführen sh dotmv
- was Sie auch tun werden, es sei denn, Sie haben ein gerootetes Gerät, da es sonst keine Möglichkeit gibt, ein Skript ausführbar zu machen. Wenn Sie den Shebang ändern, können Sie ihn verwenden exec dotmv
.
#!/bin/sh
# On android change that to /system/bin/sh.
# Validate arguments
if [ $# -lt 1 ]; then
echo "A list of one or more paths is required."
exit 1
fi
# Checks if a path exists and can be moved.
checkPath () {
if [ ! -e "$1" ]; then
echo "'$1' does not exist."
return 1;
fi
if [ ! -w "$1" ]; then
echo "Cannot move '$1', permission denied."
return 1;
fi
return 0;
}
# Finds a new path with numerical suffix.
getName () {
suf=0;
while [ -e "$1.$suf" ]
do let suf+=1
done
Dest=$1.$suf
}
# Loop through arguments -- use quotes to allow spaces in paths.
while (($#)); do
Src=$1
Dest=$1
shift
checkPath "$Src"
if [ $? -eq 0 ]; then
getName "$Src"
mv "$Src" "$Dest"
fi
done
Hoffentlich ist die Logik hier sehr einfach. Dies kann in Python, C oder einer anderen vollständigen prozeduralen Sprache mit Datei-E / A implementiert werden.