Me gustaría cambiar una extensión de archivo de *.txt
a *.text
. Intenté usar el basename
comando, pero tengo problemas para cambiar más de un archivo.
Aquí está mi código:
files=`ls -1 *.txt`
for x in $files
do
mv $x "`basename $files .txt`.text"
done
Recibo este error:
basename: too many arguments Try basename --help' for more information
bash
shell-script
rename
afbr1201
fuente
fuente
Respuestas:
Directamente de Greg's Wiki :
También vea la entrada sobre por qué no debe analizar
ls
.Editar: si tiene que usar
basename
su sintaxis sería:fuente
*.txt
sintaxis) , el doble guión simple--
y el uso del símbolo% dentro de la${}
construcción . Hasta ahora nunca me había encontrado con los dos últimos y no sabía lo que realmente estaba sucediendo con el primero.for f in *.txt; do mv -- "$f" "${f%.txt}.text"; done
Así es como cambio todas las extensiones de archivo en el directorio actual en Debian.
(Este es el
rename
comando Perl , no elutil-linux
indicado. Vea ¿Por qué la utilidad de cambio de nombre en Debian / Ubuntu es diferente a la de otras distribuciones, como CentOS? )fuente
brew install rename
y conseguí que esto funcionara.rename "s/oldExtension/newExtension/" **.txt
para cambiar el nombre de todos * .txt recursivamentefootxt.txt
. Utilice esto en su lugar: unix.stackexchange.com/questions/19654/…rename 's/$/.txt/' *
Un comando simple,
rename
fromutil-linux
, lo hará por usted, reemplazará todas las apariciones de "txt" a "texto" en todos los archivos que coincidan con "* .txt":fuente
rename
cambia la primera aparición, por lo que es mejor hacerlorename .txt .text
, pero esto no siempre funcionará (por ejemplo, cambia el nombrefoo.txtx.bar.txt
afoo.textx.bar.txt
).rename
comando es en realidadperl-rename
y usa expresiones regulares perl. Por eso, el comando equivalente sería:rename 's/.txt/.text/' *.txt
. Las personas deben verificarman rename
en su sistema para averiguar cuál tienen.Lo anterior funciona bien pero limitado al directorio actual. Pruebe el siguiente comando, que es flexible con subdirectorios. Cambiará el nombre de todos los
.txt
archivos en la estructura de directorios con una nueva extensión.fuente
rename
puede manejar múltiples archivos como argumento, puede acelerar enormemente las cosas usando en+
lugar de\;
si hay muchos de esos archivosfootxt.txt
. Utilice esto en su lugar: unix.stackexchange.com/questions/19654/…fuente
Las respuestas aquí haciendo referencia
s/oldExtension/newExtension/
son incorrectas. Si lo usas/txt/text/
, se convertiríafootxt.txt
afootext.txt
, que no es lo que desea. Incluso si usas/.txt/.text/
, eso se convertiríafootxt.txt
afo.text.txt
.Tienes que usar
\.
para que coincida con el período (.
coincidirá con cualquier personaje). Y el final$
para que coincida con el final de la línea. Solo esto coincidirá adecuadamente con la extensión.fuente
Basado en la respuesta de @Prince John Wesley, aquí hay un script bash simple para cambiar todas las extensiones de archivos en el directorio actual de
ext1
aext2
. También genera nombres de los archivos que se renombran.Ejemplo de uso (suponiendo que el nombre del script es
change-ext
):fuente
for...
) con dos líneas:shopt -s globstar
yfor f in **/*.$1
. Requiere Bash 4+.Motivo # 53 para cambiar a zsh:
zmv '(*).txt' '$1.text'
fuente
supongamos que sus archivos están dispersos en varios directorios, suponiendo que dirx sea su directorio principal, esto puede hacer el trabajo usando find:
fuente
Esto es lo que funciona para mí:
fuente
Cuando tú
y la extensión de destino es .text lo haría de esta manera:
fuente
for f in *.html; do mv -- "$f" "${f%.\*}.pug"; done
En caso de que desee saber qué salió mal en su versión: utilizó en
$files
lugar del$x
comando basename. Por lo tanto, esto debería funcionar (sin probar):fuente