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?
9 answers
Podrías usar algo como esto:
for old in *.txt; do mv $old `basename $old .txt`.md; done
Haga una copia primero!
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'
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:".
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.
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.)
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'
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
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
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.
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