Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

115
Vistas
Cómo cambiar el nombre de los archivos recursivamente a la base hexadecimal 16

¿Cómo cambiar el nombre de los archivos en diferentes carpetas (pero todas las carpetas están en una carpeta) (sin considerar cuáles son sus nombres) a la base hexadecimal 16, de forma recursiva?

ejemplo de jerarquía de carpetas

Entonces, cuando va a la siguiente carpeta, recuerda cuál fue el nombre anterior que hizo y continúa desde allí.


Por ejemplo (diferente a la captura de pantalla):
Carpeta1: 1.jpg, 1_A.jpg, ... 10th_blah.jpg
Carpeta2: 1.jpg , ..., 2000th_text1.jpg

se convertirá en ->
CarpetaTodoJunto: 1.jpg, 2.jpg, ..., A.jpg, B.jpg , ..., 7D0.jpg


La solución podría estar en javascript, bash, python o cualquier otro lenguaje de script que pueda ejecutar fácilmente en macOS.


Mi código:

 const fs = require('fs') const path = require('path'); const dir = path.resolve(__dirname, 'ImagesSuperTemp'); let i = 0 function renameFilesRecursive(dir, from, to) { fs.readdirSync(dir).forEach(it => { const itsPath = path.resolve(dir, it); const itsStat = fs.statSync(itsPath); if (itsPath.search(from) > -1) { console.log(`${i} : rename ${from} to ${to}`); fs.renameSync(itsPath, itsPath.replace(from, to)) i = i + 1 } if (itsStat.isDirectory()) { renameFilesRecursive(itsPath.replace(from, to), from, to) } }) } renameFilesRecursive(dir, /\*.jpg$/, `${i.toString(16)}.jpg`);

¡Pero no hace nada!

about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Solución de Python

(le arroja un error si desea cambiar el nombre de un archivo que ya existe, por ejemplo, está procesando la imagen 5.jpg mientras su contador está en 3, pero 3.jpg ya existe; podría evitarlo con una cláusula de except de try , pero luego lo hace no tiene imágenes siempre incrementadas en 1, no estoy seguro de lo que necesita):

 import os counter = 1 for r, d, f in os.walk(r"Images"): # can also put a full path here for name in f: # first argument here is full path to the image # second argument is the path + the hex number of the counter + the extension of the file os.rename(r + os.sep + name, r + os.sep + hex(counter).lstrip("0x") + os.path.splitext(name)[-1]) counter += 1

Editar

Documenté aún más el código, agregué un mensaje de estado y noté que desea nombres de archivos hexadecimales en mayúsculas:

 import os counter = 1 for r, d, f in os.walk(r"Images"): # can also put a full path here for name in f: # full path to original image original_fn = r + os.sep + name # path + hex number of counter + extension of file new_fn = r + os.sep + hex(counter).lstrip("0x").upper() + os.path.splitext(name)[-1] # rename, status print, incrementing counter os.rename(original_fn, new_fn) print(f"Renamed {original_fn} > {new_fn}") counter += 1

Editar 2

Aquí hay una solución para cambiar primero el nombre de todos los archivos a archivos temporales con cadenas aleatorias adjuntas, y luego cambiarles el nombre a números hexadecimales basados en un contador. Espero que eso resuelva tus problemas:

 import os import random import string for r, d, f in os.walk(r"Images"): for name in f: rnd_string = ''.join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(12)) original_fn = r + os.sep + name new_fn = r + os.sep + rnd_string + name os.rename(original_fn, new_fn) print(f"Temp. rename {original_fn} > {new_fn}") counter = 1 for r, d, f in os.walk(r"Images"): # can also put a full path here for name in f: original_fn = r + os.sep + name new_fn = r + os.sep + hex(counter).lstrip("0x").upper() + os.path.splitext(name)[-1] os.rename(original_fn, new_fn) print(f"Final rename {original_fn} > {new_fn}") counter += 1
about 4 years ago · Santiago Trujillo Denunciar

0

Hay debajo de un script bash. Cambia los valores de dest_dir y source_dir

No olvides hacerlo ejecutable con chmod +x flattener.sh

 #!/bin/env bash dest_dir="/var/tmp/flat-files" source_dir="parent-dir" if [ ! -d "${dest_dir}" ] ; then mkdir -p "${dest_dir}" fi if [ ! -f "${dest_dir}"/index.dat ] ; then printf "1" > "${dest_dir}"/index.dat || exit 1 fi find "${source_dir}" -type f -print0 |\ xargs -0 bash -c ' \ for filename ; do \ index=$(cat '"${dest_dir}"'/index.dat) ;\ printf "%d" $((index+1)) > '"${dest_dir}"'/index.dat ;\ if [[ "${filename}" =~ [.] ]] ; then \ extension=."${filename##*.}" ;\ else \ extension="" ;\ fi ;\ mv -vu "${filename}" '"${dest_dir}"'/$(printf "%X" $index)"${extension}" ;\ done' flattener
about 4 years ago · Santiago Trujillo Denunciar

0

Con bash >= 4.0 y cp (sin mv / rename ):

 shopt -s globstar unset int for i in **/*.jpg; do ((int++)) printf -v hex '%x' "$int" echo cp -v "$i" "FolderAllTogether/${hex^^}.jpg" done

Si la salida se ve bien, elimine echo .

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda