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.179con10.4.100.135. ¿Es eso lo que quieres o simplemente quieres eliminar el_TIMINGy_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
renameutilsy usarqmvcon su editor de texto favorito.qmvcarga 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
-nesto saldrá lo que va a hacer sin hacer ningún cambio:Si se ve bien, quite el
-nExplicando ...
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$3referencias 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)mmvpuede 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
renameenfoque: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 *.jpgo lo que quiera). Eso se ejecutará mucho más rápido que un bucle de shell que bifurca + ejecutivossedymvpara cada nombre de archivo, en lugar de solo una llamada de cambio de nombre del sistema. (Podrías deshacerte delseduso de las expresiones regulares incorporadas de bash, pero la bifurcaciónmvsigue siendo lenta).Probablemente haya terminado, pero aquí hay una
bashsolució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.jpgo 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 quebashes 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 binario0cuando 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 lasedexpresió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_TIMINGcosa (\ies una referencia a lai- th regex group).Refs: Xargs - hombre sed
fuente