¡Aquí hay una alternativa al guión de Joseph R que no tiene ninguna de las advertencias! Agregará un sufijo numérico a un nombre de ruta (la ruta puede ser un directorio o un archivo), incrementando el valor del sufijo hasta encontrar uno que aún no existe. Otras utilidades, como el logrotate
uso de un patrón similar, pero rotan todas las copias existentes para que la nueva siempre tenga '0' para un sufijo. Como esto no es una rotación en ese sentido, lo llamaré dotmv
. Solo recuerda que file.0
será la copia más antigua .
Por ejemplo:
dotmv somefile.txt
Renombra somefile.txt
somefile.txt.0
, a menos que este último exista, en cuyo caso será somefile.txt.1
, y así sucesivamente. Puede enumerar más de un archivo ( dotmv this that "the other thing"
etc.), todos se moverán por puntos.
Creo que esto es compatible con POSIX: se ejecuta con set -o posix
on bash (pero esa es una prueba dudosa). También probé con el shell de Android (Jelly Bean 4.2.1), y funciona allí. Sin embargo, en Android deberá cambiar el shebang como se indica o ejecutarlo sh dotmv
, lo que de todos modos lo hará a menos que tenga un dispositivo rooteado, porque de lo contrario no hay forma de hacer que un script sea ejecutable. Cambiar el shebang te permitirá usarlo 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
Esperemos que la lógica aquí sea muy directa. Esto podría implementarse en python, C o en cualquier otro lenguaje de procedimiento completo con E / S de archivo.