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.jpga 0001.jpg, wrjr3.jpga 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, yprintfpara el relleno:El uso de la
-ibandera 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á,mvintentará analizar dichos nombres de archivos como colecciones de banderas.-idebería incluirse en la respuesta y la nota debería reescribirse en consecuencia. Eso será más seguro. :(Belleza en una linea:
Puede cambiar
.extcon.png,.jpg, etc.fuente
ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; donetener cero números rellenados-nal 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#*.}"; doneResultados: (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 "
findes tu amigo" .Para contar elementos y construir comandos, se utilizó gawk . Tenga en cuenta la principal diferencia, sin embargo. Por defecto
findbusca 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 findpara ver cómo).fuente
NRpara un comando más corto.gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'$(rm -rf /).jpg.forciclo 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,findserá 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-Nopción.renamecomando, ¡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 derenamePeder Stray y Larry Wall (paqueteperl-renameen arch linux y paqueterenameen debian / ubuntu): Puedes definirte a$Nti mismo:perl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpgEl 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 delmvcomando con el fin de admitir nombres de archivos con espacios.fuente
$(rm -rf /).jpg.mv. Si tiene un archivo llamado, es decir,some thing.jpgsu 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 1para trabajar solo en jpgs en el directorio actual, ya que es mejor prevenir que curar.ls -1 *.jpglugar 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.extantes11.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
renameno 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
-ra 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
exiftoolEsto 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
-rse 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 modtimeopció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 -1crgenera 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
-nde larenamecomando 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 -1tUtiempo de creación. También necesitabarenameinstalarse, lo cual no tenía.Nuevamente usando la solución de Pero con poca modificación, porque
findque 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
lsembargo, 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 -vayuda 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.bashejecutaTenga 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.jpgy luego ejecútelo en su nombre de archivo final.fuente
lsno 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.
#! / bin / bash renombrar 'y / / _ /' * jpg # reemplazando espacios con _ let x = 0; para i en * .jpg; hacer let x = (x + 1) mv $ i $ x.jpg hechofuente
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.pyfuente
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