Вот альтернатива сценарию Джозефа Р., в котором нет ни одной оговорки! Он добавит числовой суффикс к имени пути (путь может быть каталогом или файлом), увеличивая значение суффикса до тех пор, пока не будет найден тот, который еще не существует. Другие утилиты, например, logrotate
используют аналогичный шаблон, но вращают все существующие копии, чтобы новая всегда имела «0» для суффикса. Поскольку это не вращение в этом смысле, я назову это dotmv
. Просто помните, что file.0
это будет самая старая копия.
Например:
dotmv somefile.txt
Переименовывает somefile.txt
somefile.txt.0
, если последнее не существует, в таком случае оно будет somefile.txt.1
и так далее. Вы можете перечислить более одного файла ( dotmv this that "the other thing"
и т. Д.), Все они будут перемещены точками.
Я считаю, что это POSIX-совместимый - он работает set -o posix
на Bash (но это сомнительный тест). Я также тестировал с оболочкой android (jelly bean 4.2.1), и она там работает. Тем не менее, на Android вам нужно будет изменить shebang, как указано, или запустить его, sh dotmv
что вы будете делать в любом случае, если у вас нет рутованного устройства, потому что иначе невозможно сделать исполняемый скрипт. Изменение Шебанга позволит вам использовать 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
Надеюсь, логика здесь очень проста. Это может быть реализовано на python, C или любом другом полном процедурном языке с файловым вводом / выводом.