¿Cómo puedo generar un nuevo nombre para un archivo si hay un archivo existente con ese mismo nombre? En un entorno de escritorio, se genera un nuevo nombre al agregar un número al final del nombre del archivo, pero ¿cómo se puede lograr esto desde la línea de comandos?
Estoy usando el sistema operativo Android con Busybox.
mktemp
?mktemp
no funcionará.Respuestas:
Suponiendo que tiene un shell POSIX, puede hacer esto:
Como usar esto
Esta es una función, así que guárdela en su
~/.bashrc
y llámela como lo haría normalmentemv
.Que hace esto
mv
ejecutable original en laMV
variableDEST
DEST
existe y no es un directorio, esta función asume que su cambio de nombre está tratando de bloquear un archivo.
, que marca la extensión), la extensión (cualquier cosa después de la final.
), el conteo (si lo hay; cualquier cosa en el prefijo después de la final-
).mv a.txt b.txt
que primero lo intentarámv a.txt b-001.txt
. Esta próximamv
llamada también debe ser la función en sí misma porque sib-001.txt
también existe, queremos seguir incrementando el contador hasta que encontremos un nuevo nombre de archivo que no existe.mv
se llama al ejecutable original con sus argumentos originales.Advertencias
foo-001.txt
, se moverá afoo-001-001.txt
.Notas
3
en laprintf
declaración a lo que quiera.fuente
/tmp
es un directorio existente y llamó/bin/mv file1 /tmp
No veo dónde está el problema.Generalmente uso la herramienta
mktemp
para crear archivos temporales confiables. El valor predeterminado es crear archivos, pero también puede crear directorios a través de su-d
conmutador.Ejemplo
Así es como puede crear algunos nombres temporales para los archivos en su directorio actual.
Esto creará los archivos por ti.
Referencias
fuente
mktemp
en Android, pero hago un +1 de todos modos ya que esta es una buena respuesta a una buena pregunta, U&L sabio./system/bin/sh
y parece sersh
compatible, construcciones como elif [ -w $file ]
trabajomv
yrename
están disponibles, por lo que un script para hacer esto solo con funciones integradas debería funcionar allí.¡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 quefile.0
será la copia más antigua .Por ejemplo:
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 ejecutarlosh 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á usarloexec dotmv
.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.
fuente