Hay varios archivos en un directorio que comienzan con un prefijo fgh
, por ejemplo:
fghfilea
fghfileb
fghfilec
Quiero cambiarles el nombre a todos para comenzar con el prefijo jkl
. ¿Hay un solo comando para hacer eso en lugar de cambiar el nombre de cada archivo individualmente?
file
unix
rename
batch-rename
jww
fuente
fuente
Respuestas:
Hay varias formas, pero usar
rename
probablemente sea la más fácil.Usando una versión de
rename
:Usando otra versión de
rename
(igual que la respuesta de Judy2K ):Debe consultar la página de manual de su plataforma para ver cuál de los anteriores se aplica.
fuente
rename
entonces está mostrando la sintaxis para unixhelp.ed.ac.uk/CGI/man-cgi?rename es el otrorename
parece ser un script o utilidad específica de Linux. Si le importa la portabilidad, continúe usandosed
bucles y o un script Perl en línea.brew install rename
en OS X :)Esta es la forma
sed
ymv
se puede utilizar en conjunto para hacer cambio de nombre:Según el comentario a continuación, si los nombres de los archivos tienen espacios, las comillas pueden necesitar rodear la subfunción que devuelve el nombre para mover los archivos a:
fuente
for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
touch fghfilea fghfileb fghfilec fghfile\ d
. Le sugiero que tenga en cuenta los comentarios de @DaveNelson.El cambio de nombre podría no estar en todos los sistemas. así que si no lo tienes, usa el shell de este ejemplo en bash shell
fuente
sed
no se requiere comando. Esta es más simple que la respuesta de @nik.sh
o en general en otros shells.Usando mmv :
fuente
;
junto con#1
. ejemplo:mmv ";fgh*" "#1jkl#2"
Hay muchas formas de hacerlo (no todas funcionarán en todos los sistemas unixy):
ls | cut -c4- | xargs -I§ mv fgh§ jkl§
El § puede ser reemplazado por cualquier cosa que le resulte conveniente. También podría hacer esto,
find -exec
pero eso se comporta sutilmente diferente en muchos sistemas, por lo que generalmente evito esofor f in fgh*; do mv "$f" "${f/fgh/jkl}";done
Crudo pero efectivo como dicen
rename 's/^fgh/jkl/' fgh*
Realmente bonito, pero el cambio de nombre no está presente en BSD, que es el sistema unix más común afaik.
rename fgh jkl fgh*
ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';
Si insiste en usar Perl, pero no hay cambio de nombre en su sistema, puede usar este monstruo.
Algunos de ellos son un poco complicados y la lista está lejos de ser completa, pero aquí encontrará lo que desea para casi todos los sistemas Unix.
fuente
ls
salida no debe analizarse y / o canalizarsefuente
Utilizando
find
,xargs
ysed
:Es más complejo que la solución de @ nik, pero permite cambiar el nombre de los archivos de forma recursiva. Por ejemplo, la estructura,
se transformaría a esto,
La clave para que funcione
xargs
es invocar el shell desde xargs .fuente
Para instalar el script de cambio de nombre de Perl :
Hay dos cambios de nombre como se menciona en los comentarios en la respuesta de Stephan202. Las distribuciones basadas en Debian tienen el cambio de nombre de Perl . RedHat / rpm distribuciones tienen el cambio de nombre C .
OS X no tiene uno instalado por defecto (al menos en 10.8), tampoco Windows / Cygwin.
fuente
Aquí hay una manera de hacerlo usando la línea de comandos Groovy:
fuente
En Solaris puedes probar:
fuente
for file in $(find)
es fundamentalmente defectuoso y no se puede corregir con una cita. Sifind
vuelve./file name with spaces
obtendrá unfor
bucle sobre./file
,name
,with
, yspaces
y ninguna cantidad de citar dentro del bucle ayudará (o incluso ser necesario).fuente
Este script funcionó para mí para renombrar recursivamente con directorios / nombres de archivo que posiblemente contienen espacios en blanco:
Observe la
sed
expresión que en este ejemplo reemplaza todas las ocurrencias de;
con espacio. Esto, por supuesto, debe reemplazarse de acuerdo con las necesidades específicas.
fuente
Usando herramientas StringSolver (Windows y Linux bash) que procesan con ejemplos:
Primero calcula un filtro basado en ejemplos , donde la entrada son los nombres de archivo y la salida (ok y notok, cadenas arbitrarias). Si filter tuviera la opción --auto o se invocara solo después de este comando, crearía una carpeta
ok
y una carpetanotok
y enviaría los archivos respectivamente.Luego, usando el filtro, el
mv
comando es un movimiento semiautomático que se vuelve automático con el modificador --auto. El uso de los filtros anteriores gracias a --filter, que encuentra una correspondencia entrefghfilea
ajklfilea
y luego se aplica en todos los archivos filtrados.Otras soluciones de una línea
Otras formas equivalentes de hacer lo mismo (cada línea es equivalente), para que pueda elegir su forma favorita de hacerlo.
Solución de múltiples pasos
Para encontrar cuidadosamente si los comandos funcionan bien, puede escribir lo siguiente:
y cuando esté seguro de que el filtro es bueno, realice el primer movimiento:
Si desea probar y usar el filtro anterior, escriba:
Si la transformación no es lo que deseaba (por ejemplo, incluso
mv --explain
cuando ve que algo está mal), puede escribirmv --clear
para reiniciar el movimiento de archivos o agregar más ejemplosmv input1 input2
donde input1 y input2 son otros ejemplosCuando tenga confianza, solo escriba
¡y voilá! Todo el cambio de nombre se realiza utilizando el filtro.
DESCARGO DE RESPONSABILIDAD: Soy coautor de este trabajo realizado con fines académicos. También podría haber una característica de producción de bash pronto.
fuente
Fue mucho más fácil (en mi Mac) hacer esto en Ruby. Aquí hay 2 ejemplos:
fuente
Usando renamer :
Elimine la
--dry-run
bandera una vez que esté satisfecho, la salida se ve correcta.fuente
Mi versión de renombrar archivos masivos:
fuente
Recomendaría usar mi propio script, que resuelve este problema. También tiene opciones para cambiar la codificación de los nombres de los archivos y convertir la combinación de diacríticos en caracteres precompuestos, un problema que siempre tengo cuando copio archivos de mi Mac.
fuente
stale over time
Esto funcionó para mí usando regexp:
Quería que los archivos se renombraran así:
use la expresión regular [az | _] + 0 * ([0-9] +. ) donde ([0-9] +. ) es una subcadena de grupo para usar en el comando de cambio de nombre
Produce:
Otro ejemplo:
Produce:
Advertencia, ten cuidado.
fuente
Escribí este script para buscar todos los archivos .mkv renombrando recursivamente los archivos encontrados a .avi. Puede personalizarlo según sus necesidades. He agregado algunas otras cosas, como obtener el directorio de archivos, la extensión, el nombre de archivo de una ruta de archivo en caso de que necesite referirse a algo en el futuro.
fuente
Un script genérico para ejecutar una
sed
expresión en una lista de archivos (combina lased
solución con larename
solución ):Invoque pasando una
sed
expresión al script y luego cualquier lista de archivos, como una versión derename
:fuente
También puedes usar el siguiente script. es muy fácil de ejecutar en la terminal ...
// Cambiar el nombre de varios archivos a la vez
Ejemplo:-
fuente
Otra posible expansión de parámetros :
fuente