Как я могу создать новое имя для файла, если существует существующий файл с тем же именем? В среде рабочего стола генерируется новое имя, добавляя число в конец имени файла, но как это можно сделать из командной строки?
Я использую операционную систему Android с Busybox.
mktemp
?mktemp
он не будет работать.Ответы:
Предполагая, что у вас есть оболочка POSIX, вы можете сделать это:
Как использовать это
Это функция, поэтому сохраните ее
~/.bashrc
и вызовите как обычноmv
.Что это делает
mv
исполняемому файлу вMV
переменнойDEST
DEST
существует и не является каталогом, эта функция предполагает, что ваше переименование пытается перерезать файл.
, которое обозначает расширение), расширение (что-либо после финала.
), счетчик (если есть; что-нибудь в префиксе после финала-
).mv a.txt b.txt
, сначала попытайтесьmv a.txt b-001.txt
. Этот следующийmv
вызов также должен быть самой функцией, потому что, если онаb-001.txt
также существует, мы хотим продолжать увеличивать счетчик, пока не найдем новое имя файла, которое не существует.mv
исполняемый файл вызывается с вашими исходными аргументами.Предостережения
foo-001.txt
, он будет перемещен вfoo-001-001.txt
.Ноты
3
вprintf
выражении то, что вам нравится.источник
/tmp
это существующий каталог, и вызвал «/bin/mv file1 /tmp
Я не вижу, в чем проблема».Я обычно использую инструмент
mktemp
для создания надежных временных файлов. По умолчанию он создает файлы, но также может создавать каталоги с помощью-d
переключателя.пример
Вот как вы можете создать временные имена для файлов в вашем текущем каталоге.
Это создаст файлы для вас.
Ссылки
источник
mktemp
на Android, но +1 от меня в любом случае, так как это хороший ответ на хороший вопрос, U & L мудрый./system/bin/sh
и кажетсяsh
совместимой - онаif [ -w $file ]
работает как работаmv
иrename
доступна, поэтому сценарий для этого только со встроенными модулями должен работать там.Вот альтернатива сценарию Джозефа Р., в котором нет ни одной оговорки! Он добавит числовой суффикс к имени пути (путь может быть каталогом или файлом), увеличивая значение суффикса до тех пор, пока не будет найден тот, который еще не существует. Другие утилиты, например,
logrotate
используют аналогичный шаблон, но вращают все существующие копии, чтобы новая всегда имела «0» для суффикса. Поскольку это не вращение в этом смысле, я назову этоdotmv
. Просто помните, чтоfile.0
это будет самая старая копия.Например:
Переименовывает
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
.Надеюсь, логика здесь очень проста. Это может быть реализовано на python, C или любом другом полном процедурном языке с файловым вводом / выводом.
источник