linux - varios - renombrar archivos masivamente cmd
Lote renombrar archivos (9)
Quiero volver a nombrar por lotes una serie de archivos en un directorio para que el número anterior y el hipo se eliminen del nombre del archivo.
Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW
New file name: XXX_01_xxxx_20130730235001_00000000.NEW
¿Cómo puedo hacer esto con un comando de linux?
Creo que este comando sería mejor si ejecutas el siguiente comando:
ls * | sed -e ''p;s/old-name/new-name/'' | xargs -n2 mv
aquí
ls * - lista los archivos en la carpeta actual
sed -e - ejecuta expresión
pag; - imprime el nombre del archivo antiguo
s / nombre antiguo / nombre nuevo / - producir nuevo nombre de archivo
xargs -n2 - maneja dos argumentos a mv
mv - obtiene dos parámetros y mueve la operación
Recomendación: antes de ejecutar mv, verifique lo que hace con lo que desea lograr con echo .
ls * | sed -e ''p;s/old-name/new-name/'' | xargs -n2 echo
Los siguientes ejemplos cambian de nombre
SCCF099_FG.gz5329223404623884757.tmp para
SCCF099_FG.gz
ls *tmp | sed -e ''p;s//([0-9]/)/+/.tmp/ /g'' | xargs -n2 echo
ls *tmp | sed -e ''p;s//([0-9]/)/+/.tmp/ /g'' | xargs -n2 mv
Esto debería hacerlo:
rename ''s/^[0-9]*-//;'' *
Obtiene desde el principio el bloque [0-9]
(es decir, los números) muchas veces, luego el guión y lo elimina del nombre del archivo.
Si rename
no está en su máquina, puede usar un bucle y mv
:
mv "$f" "${f#[0-9]*-}"
Prueba
$ ls
23-aa hello aaa23-aa
$ rename ''s/^[0-9]*-//;'' *
$ ls
aa hello aaa23-aa
O:
$ ls
23-a aa23-a hello
$ for f in *;
> do
> mv "$f" "${f#[0-9]*-}"
> done
$ ls
a aa23-a hello
Esto puede parecer un poco complejo, pero es bastante efectivo y funciona bien en los sistemas * nix y OSX. También actúa recursivamente, cambiando el nombre de los archivos en el directorio actual, así como cualquier subdirectorio:
find . -regex ''.*/[0-9]/{7/}[-].*'' -print > temp1 && /
cp temp1 temp2 && /
vi -c ":g//([0-9]/{7/}[-]/)/(.*/)/s///2/" -c ":x" temp2 && /
paste temp1 temp2 > temp3 && /
vi -c ":g/^/s//mv /" -c ":x" temp3 && /
sh ./temp3 && /
rm temp1 temp2 temp3
Aquí hay un desglose de lo que acaba de suceder:
La primera línea dice buscar ( find
) todos los archivos, comenzando con aquellos en el directorio actual ( .
), Cuyo nombre coincide con el patrón ( -regex
) de "7 números, seguido de un guión, seguido de 0 o más caracteres" ( ''.*/[0-9]/{7/}[-].*''
), Y escriba esos nombres de archivo y sus respectivas rutas ( -print
) en un archivo llamado temp1 ( > temp1
). Tenga en cuenta que la directiva -print
probablemente no sea necesaria en la mayoría de los casos, pero no debería dañar nada.
find . -regex ''.*/[0-9]/{7/}[-].*'' -print > temp1 && /
Luego, copie ( cp
) el contenido de temp1 en un archivo llamado temp2 .
cp temp1 temp2 && /
A continuación, abra el archivo temp2 usando el editor de texto vi y dé a vi dos comandos (usando -c
para indicar cada nuevo comando):
- Comando # 1:
- Busque en cada línea de temp2 (
:g
) el mismo patrón que buscamos arriba, excepto que esta vez agrupamos los resultados usando paréntesis (/([0-9]/{7/}[-]/)/(.*/)
). - Para cada línea coincidente, mueva el cursor al lugar donde se encontró la coincidencia y reemplace toda la coincidencia con solo el segundo grupo del patrón coincidente (
/2
).
- Busque en cada línea de temp2 (
- Comando # 2:
- Guarde los cambios realizados en temp2 y cierre el archivo (
:x
).
- Guarde los cambios realizados en temp2 y cierre el archivo (
El resultado de lo cual es este:
vi -c ":g//([0-9]/{7/}[-]/)/(.*/)/s///2/" -c ":x" temp2 && /
Ahora, concatene las líneas de temp1 con las de temp2 ( paste
) y escriba cada nueva línea combinada en un archivo llamado temp3 ( > temp3
).
paste temp1 temp2 > temp3 && /
A continuación, ejecute vi nuevamente, siguiendo los mismos pasos anteriores, pero esta vez busque el comienzo de cada línea ( ^
) dentro del archivo temp3 y agregue mv y un espacio justo después de él ( mv
).
vi -c ":g/^/s//mv /" -c ":x" temp3 && /
Luego, ejecute el contenido de temp3 ( ./temp3
) como un script de shell ( sh
).
sh ./temp3 && /
Finalmente, elimine ( rm
) cada uno de los archivos temporales que creamos durante todo el proceso.
rm temp1 temp2 temp3
Puedes usar esta herramienta: rnm
Código para hacer lo que quieras:
rnm /path/to/the/directory -fo -dp -1 -rs ''/^/d+-//'' -ss ''^/d+-''
-fo
es para modo de solo archivo
-dp
es la profundidad del directorio ( -1
significa profundidad ilimitada).
-rs
es reemplazar la cadena. /d+-
regex se está reemplazando con una cadena vacía.
-ss
es una cadena de búsqueda, busca archivos con ^/d+-
regex. (Se podría omitir, sin embargo, algunos mensajes de error inocuos se imprimirían en la pantalla).
Realmente me gusta algo como "renombrar * .mp3 * .mp4".
Pero ninguna de las otras respuestas me da eso. Así que escribí un programa de haskell para hacerlo.
https://hackage.haskell.org/package/batch-rename
Con esto puedes hacer: batch_rename "DCIM * .jpg" "* .png"
Si los primeros números son siempre de la misma longitud:
for F in *new ; do
mv $F ${F:8}
done
El ${parameter:number}
realiza una expansión de subcadena: toma la cadena que comienza en el octavo carácter.
Hay muchas otras ediciones de cadenas disponibles en expansiones para manejar otros casos.
También hay una herramienta práctica de GUI pyRenamer
https://wiki.ubuntuusers.de/pyRenamer/
Usando renamer (compatible con Windows, Mac y Linux):
$ renamer --find ''//d+-(.*)/'' --replace ''$1'' *
Esto eliminará todos los números y el primer guión del inicio de todos los archivos en el directorio actual.
vimv permite cambiar el nombre de varios archivos con las capacidades de edición de texto de Vim.
Al ingresar vimv se abre una ventana de Vim que muestra una lista de todos los archivos y puede hacer una comparación de patrones, selección visual, etc. para editar los nombres. Después de salir de Vim, los archivos serán renombrados.
El screencast en el archivo README muestra cómo resuelve la pregunta del póster original.
[Descargo de responsabilidad: soy el autor de la herramienta]