Me gustaría cambiar una extensión de archivo de *.txta *.text. Intenté usar el basenamecomando, 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 :
# Renombrar todo * .txt a * .text para f en * .txt; hacer mv - "$ f" "$ {f% .txt} .text" hechoTambién vea la entrada sobre por qué no debe analizar
ls.Editar: si tiene que usar
basenamesu sintaxis sería:para f en * .txt; hacer mv - "$ f" "$ (nombre base -" $ f ".txt) .text" hechofuente
*.txtsintaxis) , 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"; doneAsí es como cambio todas las extensiones de archivo en el directorio actual en Debian.
(Este es el
renamecomando Perl , no elutil-linuxindicado. Vea ¿Por qué la utilidad de cambio de nombre en Debian / Ubuntu es diferente a la de otras distribuciones, como CentOS? )fuente
brew install renamey conseguí que esto funcionara.rename "s/oldExtension/newExtension/" **.txtpara cambiar el nombre de todos * .txt recursivamentefootxt.txt. Utilice esto en su lugar: unix.stackexchange.com/questions/19654/…rename 's/$/.txt/' *Un comando simple,
renamefromutil-linux, lo hará por usted, reemplazará todas las apariciones de "txt" a "texto" en todos los archivos que coincidan con "* .txt":fuente
renamecambia la primera aparición, por lo que es mejor hacerlorename .txt .text, pero esto no siempre funcionará (por ejemplo, cambia el nombrefoo.txtx.bar.txtafoo.textx.bar.txt).renamecomando es en realidadperl-renamey usa expresiones regulares perl. Por eso, el comando equivalente sería:rename 's/.txt/.text/' *.txt. Las personas deben verificarman renameen 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
.txtarchivos en la estructura de directorios con una nueva extensión.fuente
renamepuede 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.txtafootext.txt, que no es lo que desea. Incluso si usas/.txt/.text/, eso se convertiríafootxt.txtafo.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
ext1aext2. 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 globstaryfor 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"; doneEn caso de que desee saber qué salió mal en su versión: utilizó en
$fileslugar del$xcomando basename. Por lo tanto, esto debería funcionar (sin probar):fuente