Aqui está uma alternativa ao script de Joseph R, que não tem nenhuma das ressalvas! Anexará um sufixo numérico a um nome de caminho (o caminho pode ser um diretório ou um arquivo), incrementando o valor do sufixo até que seja encontrado um que ainda não exista. Outros utilitários, como logrotate
usam um padrão semelhante, mas giram todas as cópias existentes para que o novo sempre tenha '0' como sufixo. Como não é uma rotação nesse sentido, vou chamá-lo dotmv
. Lembre-se de que file.0
será a cópia mais antiga .
Por exemplo:
dotmv somefile.txt
Renomeia somefile.txt
somefile.txt.0
, a menos que exista, caso em que será somefile.txt.1
, e assim por diante. Você pode listar mais de um arquivo ( dotmv this that "the other thing"
etc.), todos eles serão movidos por pontos.
Acredito que isso seja compatível com POSIX - ele roda set -o posix
no bash (mas esse é um teste duvidoso). Também testei com o shell do Android (Jelly Bean 4.2.1) e funciona lá. No entanto, no Android, você precisará alterar o shebang conforme indicado ou executá-lo sh dotmv
- o que você fará de qualquer maneira, a menos que tenha um dispositivo raiz, porque não há como tornar um script executável de outra forma. Alterar o shebang permitirá que você use 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
Espero que a lógica aqui seja muito direta. Isso pode ser implementado em python, C ou qualquer outra linguagem processual completa com E / S de arquivo.