Tengo varios archivos:
10.3.100.179_01_20161018_230014_5335.jpg
10.3.100.179_01_20161018_231514_0814.jpg
10.3.100.179_01_20161018_233014_5706.jpg
10.3.100.179_01_20161018_234514_0896.jpg
10.3.100.179_01_20161018_230114_5395.jpg
10.3.100.179_01_20161018_231614_1145.jpg
10.3.100.179_01_20161018_233114_6047.jpg
10.3.100.179_01_20161018_234614_0547.jpg
10.3.100.179_01_20161018_230114_5492.jpg
10.3.100.179_01_20161018_231614_1264.jpg
10.3.100.179_01_20161018_233114_6146.jpg
10.3.100.179_01_20161018_234614_0658.jpg
10.3.100.179_01_20161018_230214_5630.jpg
10.3.100.179_01_20161018_231714_7135.jpg
Quiero cambiar el nombre con este formato:
10.4.100.135_01_20161013131108389_TIMING.jpg
10.4.100.135_01_20161013131111390_TIMING.jpg
10.4.100.135_01_20161013131114401_TIMING.jpg
10.4.100.135_01_20161013131117431_TIMING.jpg
10.4.100.135_01_20161013131120418_TIMING.jpg
10.4.100.135_01_20161013131123461_TIMING.jpg
10.4.100.135_01_20161013131126511_TIMING.jpg
Necesita eliminar la _
marca de tiempo en y agregar el _TIMING
.
command-line
batch-rename
Jojo Mendoza
fuente
fuente
10.3.100.179
con10.4.100.135
. ¿Es eso lo que quieres o simplemente quieres eliminar el_TIMING
y_
el tiempo?10.4.100.135_01_2016-10-13T13:11:08.389_TIMING.jpg
(y "TIMING" podría incluso eliminarse, ya que ahora se ve claramente como una fecha y hora (y milisegundos), especialmente cuando el estándar se generaliza. El T es parte del estándar y yo creció a gustar (y llevarlo a cabo se rompe la norma ^^):
en un nombre de archivo. Creo que Windows no lo admite.Respuestas:
Instalar
renameutils
y usarqmv
con su editor de texto favorito.qmv
carga todos los nombres en su editor y cuando guarda y cierra aplica sus cambios a los archivos reales. Si los cambios son inconsistentes (p. Ej., Dos archivos tienen el mismo nombre), abortará sin tocar nada. También maneja los nombres circulares correctamente.Yo suelo hacer:
para que muestre solo una columna de nombres (hacer: solo destino). Así es como se ve:
Si lo combina con los múltiples cursores de SublimeText, Atom o Visual Studio Code, es una herramienta muy agradable y poderosa para renombrar en masa. Por ejemplo, para Atom, lo harías
EDITOR="atom -w" qmv -f do
.fuente
Use
rename
...Con
-n
esto saldrá lo que va a hacer sin hacer ningún cambio:Si se ve bien, quite el
-n
Explicando ...
s/something/something_else/
buscar y reemplazar^
el comienzo del nombre (anclaje)[0-9]
cualquier número+
uno o más de los caracteres anteriores\.
literal.
(sin\
esto coincide con ningún carácter)()
para mantener esta parte$1$2$3$3
referencias a las cosas que coincidieron anteriormente y se mantuvieron con()
Nota:
*
al final del comando coincide todos los archivos visibles en el directorio actual. Use un globo más adecuado si es necesario.fuente
prename
(p para perl, porque el primer argumento es una expresión perl)mmv
puede hacerlo de la siguiente manera:# 1, # 2, # 3, ... hace referencia a cada uno de ellos con el '*' correspondiente aquí.
Es aún más corto con:
fuente
Otro
rename
enfoque:Si eso parece funcionar como lo desea, elimine el
-n
.fuente
También puedes usar lo siguiente. Primero haga una copia de seguridad de sus archivos e intente esto:
sed 's/\(.*\)_\(.*\)_/\1\2/')
elimina los_
caracteres en la marca de tiempo.Por ejemplo:
fuente
find -maxdepth 1 -exec rename ... {} +
para agrupar la lista del directorio actual en la línea de comando de renombrar. (agregue-name *.jpg
o lo que quiera). Eso se ejecutará mucho más rápido que un bucle de shell que bifurca + ejecutivossed
ymv
para cada nombre de archivo, en lugar de solo una llamada de cambio de nombre del sistema. (Podrías deshacerte delsed
uso de las expresiones regulares incorporadas de bash, pero la bifurcaciónmv
sigue siendo lenta).Probablemente haya terminado, pero aquí hay una
bash
solución (simple) :¿Es "simple ... solución bash" un oxímoron?
PD: La lógica en el bucle se probó con uno de sus nombres de archivo de ejemplo. Pasó.
fuente
[[ $f ~= (.*)_(.*)_(.*)_(.*)\.jpg ]];
newname=${BASH_REMATCH[1]${BASH_REMATCH:2:4}TIMING.jpg
o algo así. (totalmente no probado y probablemente equivocado, pero la idea general es que los grupos de captura entren en la matriz BASH_REMATCH).bash
) grupos de captura, y para ser sincero, bash no es el primer idioma con el que los probaría. (Creo quebash
es un lenguaje feo). Aún así, es una buena solución y me enseñó algo muy bueno.printf -v "$3" ...
para establecer la variable cuyo nombre está en$3
). Desmontando toda la línea de comando y volviendo a colocarla juntos es bastante difícil de seguir / depurar, al menos lo encontré de esa manera al tratar de limpiarlo / corregir errores. Ver el código en githubSi pudiera usar GUI, recomendaría pyRenamer .
Está presente en la mayoría de las distribuciones, fi en Ubuntu:
Puede hacer todo lo que quieras y más.
fuente
Aquí está su oneliner incorporado crudo
find
+xargs
+sed
+mv
(love oneliners):Explicación:
find . -name "*.jpg" | sort | xargs sh -c <command> sh
: enumere todos los archivos JPEG en el directorio actual y luego ejecute un comando de shell para cada uno (la clasificación es opcional, por supuesto, pero mantenga las cosas un poco más limpias si está iniciando sesión en algún lugar)-print0
,-z
,-0
: Es buena costumbre de elementos separados con binario0
cuando tokenizar nombres de archivo para evitar problemas con la in-the-middle espacios en blanco (no es su caso, sin embargo)mv "$filename" $(echo "${filename}" | sed "s/\([0-9]\{8\}\)_\([0-9]\{6\}\)_\([0-9]\{4\}\)/\1\2\3_TIMING/g");
: (las barras invertidas en lased
expresión regular de 's no ayudan a su legibilidad, pero es simple) cambie el nombre de cada archivo reemplazando la secuencia separada por guiones bajos de 8 + 6 + 4 dígitos con su concatenación contigua más esta_TIMING
cosa (\i
es una referencia a lai
- th regex group).Refs: Xargs - hombre sed
fuente