Quiero cambiar el nombre de los archivos en un directorio a números secuenciales. Basado en la fecha de creación de los archivos.
Por ejemplo sadf.jpg
a 0001.jpg
, wrjr3.jpg
a 0002.jpg
, y así sucesivamente, el número de ceros a la izquierda, dependiendo de la cantidad total de archivos (sin necesidad de ceros adicionales si no es necesario).
bash
rename
batch-rename
Gnutt
fuente
fuente
Respuestas:
Intente usar un bucle
let
, yprintf
para el relleno:El uso de la
-i
bandera evita sobrescribir automáticamente los archivos existentes.fuente
printf -v new "%04d.jpg" ${a}
para poner el valor en la variable. Y((a++))
trabaja para incrementar la variable. Además, esto no lo hace en el orden de la fecha de creación ni minimiza el relleno que son las cosas que especificó el OP. Sin embargo, debe tenerse en cuenta que Linux / Unix no almacena una fecha de creación.mv -- "$i" "$new"
para manejar correctamente los nombres de los archivos de origen que comienzan con guiones; tal como está,mv
intentará analizar dichos nombres de archivos como colecciones de banderas.-i
debería incluirse en la respuesta y la nota debería reescribirse en consecuencia. Eso será más seguro. :(Belleza en una linea:
Puede cambiar
.ext
con.png
,.jpg
, etc.fuente
ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; done
tener cero números rellenados-n
al comando mv para evitar sobrescribir accidentalmente los archivos. Descubierto esto de la manera difícil!ls -1prt | grep -v "/$" | cat -n | while read n f; do mv -n "${f}" "$(printf "%04d" $n).${f#*.}"; done
Resultados: (1) ordenados por orden de modificación, archivos posteriores con índices posteriores; (2) ignora los directorios, y no es recursivo; (3) índices de pads; (4) mantiene la extensión original.Me gusta la solución de Gauteh por su simplicidad, pero tiene un inconveniente importante. Cuando se ejecuta en miles de archivos, puede obtener el mensaje "lista de argumentos demasiado larga" ( más sobre esto ), y en segundo lugar, el script puede ser realmente lento. En mi caso, ejecutándolo en aproximadamente 36,000 archivos, el script se movió aprox. ¡un artículo por segundo! No estoy muy seguro de por qué sucede esto, pero la regla que obtuve de mis colegas fue "
find
es tu amigo" .Para contar elementos y construir comandos, se utilizó gawk . Tenga en cuenta la principal diferencia, sin embargo. Por defecto
find
busca archivos en el directorio actual y sus subdirectorios, así que asegúrese de limitar la búsqueda en el directorio actual solo, si es necesario (useman find
para ver cómo).fuente
NR
para un comando más corto.gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
$(rm -rf /).jpg
.for
ciclo no está tomando 1 segundo por archivo, estrictamente hablando. Está tomando mucho tiempo obtener los 36,000 nombres de archivo del sistema de archivos, luego los recorre razonablemente rápido. Muchos sistemas de archivos tienen problemas con directorios grandes, independientemente de los comandos precisos que ejecute; pero, por lo general,find
será más rápido que un comodín de shell porque tiene que buscar y ordenar la lista de archivos coincidentes.con el comando "renombrar"
o
fuente
rename
(Linux Mint 13) no tiene una-N
opción.rename
comando, ¡pero nunca lo supe-N
! ¡Gracias!rename
. El enlace publicado por @Bostrot es otra herramienta de cambio de nombre y parece que @RomanRhrnNesterov usó esa. ¶ Para todos los usuarios derename
Peder Stray y Larry Wall (paqueteperl-rename
en arch linux y paqueterename
en debian / ubuntu): Puedes definirte a$N
ti mismo:perl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
El uso de la solución de Pero en OSX requirió alguna modificación. Solía:
nota: las barras invertidas están ahí para continuar la línea
editar 20 de julio de 2015: incorporó los comentarios de @ klaustopher para citar el
\"%s\"
argumento delmv
comando con el fin de admitir nombres de archivos con espacios.fuente
$(rm -rf /).jpg
.mv
. Si tiene un archivo llamado, es decir,some thing.jpg
su secuencia de comandos falla. Esto es lo que usé:find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv \"%s"\ wallpaper-%04d.jpg\n", $0, a++ }' | bash
-maxdepth 1
para trabajar solo en jpgs en el directorio actual, ya que es mejor prevenir que curar.ls -1 *.jpg
lugar de buscar, de lo contrario no se ordenará. O agregue un|sort|
antes de awkUn bash one liner muy simple que mantiene las extensiones originales, agrega ceros a la izquierda y también funciona en OSX:
Versión simplificada de http://ubuntuforums.org/showthread.php?t=1355021
fuente
9.ext
antes11.ext
, pero otras herramientas (comols
) tampoco lo harán.Para trabajar en todas las situaciones, coloque un \ "para los archivos que tienen espacio en el nombre
fuente
$(rm -rf /)
todavía se respetan.Si su
rename
no es compatible-N
, puede hacer algo como esto:Editar Para comenzar con un número dado, puede usar el código (algo feo) a continuación, simplemente reemplace 123 con el número que desee:
Esto enumera los archivos en orden por hora de creación (los más nuevos primero, agregue
-r
a ls para ordenarlos de forma inversa), luego envía esta lista de archivos para cambiar el nombre. Renombrar usa código perl en la expresión regular para formatear e incrementar el contador.Sin embargo, si está tratando con imágenes JPEG con información EXIF, le recomendaría
exiftool
Esto es de la documentación de exiftool , en "Ejemplos de cambio de nombre"
fuente
rename
?En OSX , instale el script de cambio de nombre de Homebrew:
Entonces puedes hacerlo realmente ridículamente fácil:
O para agregar un buen prefijo:
fuente
Global symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
Siga el comando cambiar el nombre de todos los archivos a la secuencia y también la extensión en minúsculas:
fuente
Tuve un problema similar y escribí un script de shell por esa razón. He decidido publicarlo independientemente de que ya se hayan publicado muchas buenas respuestas porque creo que puede ser útil para alguien. ¡Siéntete libre de mejorarlo!
numerar
@Gnutt El comportamiento que desea puede lograrse escribiendo lo siguiente:
Si la opción
-r
se deja fuera, el escariado solo se simulará (debería ser útil para las pruebas).La opción L describe la longitud del número objetivo (que se rellenará con ceros a la izquierda). También es posible agregar un prefijo / sufijo con las opciones
-p <prefix>
-s <suffix>
.En caso de que alguien quiera que los archivos se ordenen numéricamente antes de que se numeren, simplemente elimine la
-o modtime
opción.fuente
fuente
Supongamos que tenemos estos archivos en un directorio, en orden de creación, siendo el primero el más antiguo:
luego
ls -1cr
genera exactamente la lista anterior. Entonces puedes usarrename
:que salidas
La advertencia "uso de valor no inicializado [...]" se muestra para archivos sin extensión; Puedes ignorarlo.
Eliminar
-n
de larename
comando para aplicar realmente el cambio de nombre.Esta respuesta está inspirada en la respuesta de Luke de abril de 2014 . Ignora el requisito de Gnutt de establecer el número de ceros a la izquierda dependiendo de la cantidad total de archivos.
fuente
ls -1tU
tiempo de creación. También necesitabarename
instalarse, lo cual no tenía.Nuevamente usando la solución de Pero con poca modificación, porque
find
que atravesará el árbol del directorio en el orden en que los elementos se almacenan dentro de las entradas del directorio. Esto (en su mayoría) será consistente de una ejecución a otra, en la misma máquina y esencialmente será un "orden de creación de archivo / directorio" si no ha habido eliminaciones.Sin embargo, en algunos casos necesita obtener un orden lógico, por ejemplo, por nombre, que se utiliza en este ejemplo.
fuente
blahblah; rm -r * blahblah.jpg
?Ordenado por tiempo, limitado a jpg, ceros a la izquierda y un nombre base (en caso de que probablemente desee uno):
(todo en una línea, sin el
\
)fuente
ls
embargo, dudo en votar cualquier cosa que use en un script.rename -vn - elimina n para el modo de prueba
{$ i = 1;} - número de inicio de control
"% 04d.jpg" : controla el recuento cero 04 y establece la extensión de salida .jpg
fuente
rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
Para mí, esta combinación de respuestas funcionó perfectamente:
ls -v
ayuda a ordenar 1 10 9 en el orden correcto: 1 9 10, evitando problemas de extensión de nombre de archivo con jpg JPG jpeggawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'
renumeraciones con 4 caracteres y ceros a la izquierda. Al evitar mv, no intento sobrescribir accidentalmente algo que ya existe al tener accidentalmente el mismo número.bash
ejecutaTenga en cuenta lo que @xhienne dijo, canalizar contenido desconocido para golpear es un riesgo de seguridad. Pero este no fue el caso para mí, ya que estaba usando mis fotos escaneadas.
fuente
También puedes usar ls
fuente
blahblah; rm -r * blahblah.JPG
?La mayoría de las otras soluciones sobrescribirán los archivos existentes ya nombrados como un número. Esto es particularmente un problema si ejecuta el script, agrega más archivos y luego ejecuta el script nuevamente.
Este script cambia el nombre de los archivos numéricos existentes primero:
fuente
Este oneliner enumera todos los archivos en el directorio actual, ordena por marca de tiempo de creación en orden inverso (significa que el archivo más antiguo está al principio) y cambia el nombre automáticamente con ceros finales según lo requiera la cantidad de archivos. La extensión del archivo se conservará.
Por lo general, solo tengo una carpeta desde hace años para fotos y películas de teléfonos móviles. Aplicando este comando, mis imágenes y películas están listas para una presentación de diapositivas en el orden correcto en la televisión o el archivo también.
Tenga en cuenta que si tiene colisiones de nombres de archivos, está perdiendo archivos. Así que primero cambie el nombre a algo extraño
temp001.jpg
y luego ejecútelo en su nombre de archivo final.fuente
ls
no una, sino dos veces, parece que esto debería evitarse, pero no lo he estudiado en profundidad.ls
, por eso se requieren dos de ellos. 3. Tales comandos son de una sola vez y no están destinados a ser incluidos en los scripts, por lo que hay una razón por la cual las personas prefieren frases sencillasEsto es lo que funcionó para mí.
He utilizado el comando renombrar para que si algún archivo contiene espacios en su nombre, el comando mv no se confunda entre espacios y el archivo real.
fuente
Hoy en día hay una opción después de seleccionar varios archivos para cambiar el nombre (lo he visto en el administrador de archivos thunar).
Un aviso viene con todos los archivos en ese directorio en particular, solo verifique con la sección de categoría
fuente
Este script ordenará los archivos por fecha de creación en Mac OS bash. Lo uso para renombrar videos en masa. Simplemente cambie la extensión y la primera parte del nombre.
fuente
blahblah; rm -r * blahblah.mp4
?Aquí otra solución con el comando "renombrar":
fuente
rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
La respuesta de Pero me trajo aquí :)
Quería cambiar el nombre de los archivos en relación con el tiempo, ya que los visores de imágenes no mostraban las imágenes en orden de tiempo.
fuente
blahblah; rm -r * blahblah.jpg
? Solo un ejemplo extremo.Si está utilizando el Anotador de imágenes para etiquetar las imágenes.
$ make qt5py3
$ python3 labelImg.py
fuente
Para renumerar 6000, los archivos en una carpeta puede usar la opción 'Cambiar nombre' del programa ACDsee.
Para definir un prefijo, use este formato:
####"*"
Luego configure el número de inicio y presione Cambiar nombre y el programa cambiará el nombre de los 6000 archivos con números secuenciales.
fuente