Cambiar las extensiones de archivo para todos los archivos de un directorio OSX


Tengo un directorio lleno de archivos con una extensión (.txt en este caso) que quiero convertir automáticamente a otra extensión (. md).

¿Hay un easy terminal one liner que pueda usar para convertir todos los archivos de este directorio a una extensión de archivo diferente?

¿O necesito escribir un script con una expresión regular?

Author: Ben McCormick, 2013-02-15

9 answers

Podrías usar algo como esto:

for old in *.txt; do mv $old `basename $old .txt`.md; done

Haga una copia primero!

 115
Author: Pascal Belloncle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-15 02:11:44

Alternativamente, puede instalar la utilidad ren (renombrar)

brew install ren

ren '*.txt' '#1.md'

Si desea cambiar el nombre de los archivos con prefijo o sufijo en los nombres de archivo

ren 'prefix_*.txt' 'prefix_#1.md'
 49
Author: Renaud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-11 14:59:43

La terminal no es necesaria para esto... Simplemente resalte todos los archivos que desea cambiar el nombre. Haga clic derecho y seleccione "Rename # # items "y simplemente escriba".txt "en el cuadro" Buscar: "y". md "en el cuadro" Reemplazar con:".

 39
Author: Vicky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-29 02:49:16

La forma preferida de Unix para hacer esto (sí, OS X está basado en Unix) es:

ls | sed 's/^\(.*\)\.txt$/mv "\1.txt" "\1.md"/' | sh

¿Por qué hacer un bucle con for si ls by design recorre toda la lista de nombres de archivo? Tienes pipas, úsalas. Puede crear / modificar no solo la salida utilizando comandos, sino también comandos (derecha, es decir, comandos creados por un comando, que es lo que Brian Kernighan, uno de los inventores de Unix, le gustó más en Unix), así que echemos un vistazo a lo que el ls y el sed produce al eliminar el pipe to sh:

$ ls | sed 's/^\(.*\)\.txt$/mv "\1.txt" "\1.md"/'
mv "firstfile.txt" "firstfile.md"
mv "second file.txt" "second file.md"
$

Como puede ver, no es solo un guión, sino un script completo, que además funciona creando otro script como salida. Así que vamos a alimentar el script producido por el script de una línea a sh, que es el intérprete de script de OS X. Por supuesto, funciona incluso para nombres de archivo con espacios en él.

POR cierto: Cada vez que escribe algo en Terminal crea un script, incluso si es solo un comando con una palabra como ls o date etc. Todo lo que se ejecuta en un shell Unix es siempre un script / programa, que es solo un flujo basado en ASCII (en este caso un flujo de instrucciones opuesto a un flujo de datos).

Para ver los comandos reales siendo ejecutados por sh, simplemente agregue una opción -x después de sh, que activa la salida de depuración en el shell, por lo que verá cada comando mv siendo ejecutado con los argumentos reales pasados por el script del editor sed (sí, otro script dentro del script :-) ).

Sin embargo, si te gusta la complejidad, incluso puedes usar awk y si te gusta instalar otros programas para hacer solo un trabajo básico, existe ren. Conozco incluso a personas que preferirían escribir un script de 50 líneas más o menos perl para esta tarea sencilla de todos los días.

Tal vez sea más fácil en finder cambiar el nombre de los archivos, pero si se conecta de forma remota a un Mac (por ejemplo, a través de ssh), el uso de finder no es posible en absoluto. Es por eso que la línea cmd sigue siendo muy útil.

 7
Author: LBC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-18 22:47:00

Basado en la respuesta seleccionada y más precisa anterior, aquí hay una función bash para la reutilización:

function change_all_extensions() {
    for old in *."$1"; do mv $old `basename $old ."$1"`."$2"; done
}

Uso:

$ change_all_extensions txt md

(No pude averiguar cómo obtener un formato de código limpio en un comentario sobre esa respuesta.)

 4
Author: James Tomasino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-14 23:49:32

No hay necesidad de escribir un script para ello simplemente pulse este comando

find ./ -name "*.txt" | xargs -I '{}' basename '{}' | sed 's/\.txt//' | xargs -I '{}' mv '{}.txt'  '{}.md'
 1
Author: Saurabh Bhoomkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-29 04:01:11

Tuve un problema similar donde los archivos fueron nombrados .gifx.gif al final y esto funcionó en OS X para eliminar el último .gif:

for old in *.gifx.gif; do
    mv $(echo "$old") $(echo "$old" | sed 's/x.gif//');
done
 1
Author: Ken Richardson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-14 15:40:47
    cd $YOUR_DIR
    ls *.txt > abc
    mkdir target // say i want to move it to another directory target in this case
    while read line
    do 
    file=$(echo $line |awk -F. '{ print $1 }')
    cp $line target/$file.md  // depends if u want  to move(mv) or copy(cp)
    done < abc
 0
Author: Manish Ranjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-21 08:57:37

Para aquellos de ustedes que no son realmente buenos en programación, pueden revisar este artículo en wiki how.
Muestra muchos métodos de hacerlo que no implican codificar
y también puedes revisar este blogpost en cambiar las extensiones de archivo.
Contiene una aplicación de consola que hace todas las cosas por usted.

 0
Author: Ravened writer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-27 05:11:09