Tengo un directorio que contiene archivos de imagen numerados, algo como esto:
01.png
02.png
03.png
03.svg
04.png
05.png
06.jpg
07.png
08.png
09.png
09.svg
10.png
A veces puede haber varias versiones de un archivo en diferentes formatos (por ejemplo. Una png
y svg
versión del 03
y 09
archivos anteriores) pero los números son de otra manera consecutiva. Por lo general, hay 40-80 de estos archivos en cada directorio. Los números corresponden al orden en que aparecen estas imágenes en un manuscrito (un documento de Word, pero eso no es importante). No hay otra forma de determinar el orden de las imágenes.
Si agrego una nueva imagen al manuscrito, necesito colocar una copia de la imagen en este directorio con la numeración correcta. Entonces, si la nueva imagen es la quinta en el manuscrito, necesito cambiar el nombre de los archivos en el directorio a este para dejar espacio:
01.png
02.png
03.png
03.svg
04.png
06.png
07.jpg
08.png
09.png
10.png
10.svg
11.png
¿Cuál es la forma más directa desde la línea de comando, o desde un script o macro para renumerar todos los archivos que comienzan en un número determinado? Tengo una instalación estándar de Fedora Linux usando bash.
Esto sería más fácil en zsh, donde puedes usar
On
calificador global para ordenar las coincidencias en orden decreciente (yn
para usar el orden numérico, en caso de que los nombres de los archivos no tengan ceros al mismo ancho);(l:WIDTH::FILLER:)
bandera de expansión de parámetros para rellenar todos los números con el mismo ancho (el ancho del número más grande).En bash, aquí hay un script que asume que los archivos están rellenados a un ancho fijo (de lo contrario, el script no cambiará el nombre de los archivos correctos) y los pads a un ancho fijo (que debe especificarse).
fuente
Este problema exacto está cubierto en este artículo . Tenga en cuenta que tendría que modificarlo para admitir los formatos SVG y PNG, agregando un segundo paso de MV.
fuente
Más fácil:
Usted obtendrá:
fuente
No parece haber mucho interés reciente en esta pregunta, pero, si alguien se topa con ella, hay tres problemas aquí. Una es cómo seleccionar archivos para renombrarlos según criterios semánticos (el rango no es léxico y no puede especificarse mediante comodines o incluso expresiones regulares; la teoría de autómatas dice que esto es más complejo que un NFA). El segundo es cómo cambiar un nombre modificando una parte de él. El tercero es cómo evitar la colisión de nombres. Un script en Bash y muchos otros idiomas puede hacer esta transformación específica, pero la mayoría de nosotros preferiría no tener que escribir un programa cada vez que queramos renombrar un grupo de archivos. Con mi rene.py (gratuito y de código abierto) puede hacer lo que quiera, pero se necesitan dos invocaciones para evitar el problema de colisión de nombres. primero
rene ?.*/#7-80 %?.* B
incrementa todos los nombres en el rango, agregando un prefijo de% para evitar nombres existentes. Luegorene %* *
elimina este prefijo de los archivos que lo tienen. Describo esto en https://sourceforge.net/p/rene-file-renamer/discussion/examples/thread/f0fe8aa63c/fuente