Modification des extensions de fichiers pour tous les fichiers d’un répertoire OSX

J’ai un répertoire plein de fichiers avec une extension (.txt dans ce cas) que je veux convertir automatiquement en une autre extension (.md).

Existe-t-il un terminal facile à utiliser pour convertir tous les fichiers de ce répertoire en une extension de fichier différente?

Ou dois-je écrire un script avec une regex?

Vous pourriez utiliser quelque chose comme ceci:

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

Faites d’abord une copie!

Vous pouvez également installer l’utilitaire ren (rename)

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

Si vous souhaitez renommer les fichiers avec un préfixe ou un suffixe dans les noms de fichiers

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

Terminal n’est pas nécessaire pour cela … Soulignez simplement tous les fichiers que vous souhaitez renommer. Cliquez avec le bouton droit de la souris et sélectionnez “Rename ## items” et tapez simplement “.txt” dans les champs “Find:” et “.md” dans la zone “Replace with:”.

La manière préférée d’Unix de faire ceci (oui, OS X est basé sur Unix) est:

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

Pourquoi boucler avec for si ls by design fait une boucle sur toute la liste des noms de fichiers? Vous avez des pipes, utilisez-les. Vous pouvez créer / modifier non seulement les sorties à l’aide de commandes, mais aussi les commandes (à droite, les commandes créées par une commande, ce que Brian Kernighan, l’un des inventeurs d’Unix, appréciait le plus sous Unix), le ls et le sed produit en enlevant le tuyau à sh :

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

Comme vous pouvez le voir, il ne s’agit pas seulement d’une seule ligne, mais d’un script complet, qui fonctionne en outre en créant un autre script en sortie. Donc, alimentons simplement le script produit par le script one-liner, qui est l’ interpréteur de script d’OS X. Bien sûr, cela fonctionne même pour les noms de fichiers comportant des espaces.

BTW: Chaque fois que vous tapez quelque chose dans Terminal, vous créez un script, même s’il ne s’agit que d’une seule commande avec un mot comme ls ou date etc. Tout ce qui tourne dans un shell Unix est toujours un script / programme. stream basé (dans ce cas un stream d’instructions opposé à un stream de données).

Pour voir les commandes en cours d’exécution par sh , ajoutez simplement une option -x après sh , qui active la sortie de débogage dans le shell, vous verrez donc toutes les commandes mv exécutées avec les arguments réels transmis par le script de l’éditeur sed (oui, un autre script dans le script :-)).

Cependant, si vous aimez la complexité, vous pouvez même utiliser awk et si vous souhaitez installer d’autres programmes pour faire simplement du travail de base, il existe des ren . Je connais même les gens qui préfèrent écrire un script perl 50 lignes pour cette simple tâche quotidienne.

Il est peut-être plus facile de trouver des fichiers dans finder, mais si vous êtes connecté à distance à un Mac (par exemple via ssh ), vous ne pouvez pas utiliser finder. C’est pourquoi la ligne de commande est toujours très utile.

Sur la base de la réponse sélectionnée et la plus précise ci-dessus, voici une fonction bash pour la réutilisabilité:

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

Usage:

 $ change_all_extensions txt md 

(Je ne pouvais pas comprendre comment obtenir un formatage de code propre dans un commentaire sur cette réponse.)

Pas besoin d’écrire un script, il suffit d’appuyer sur cette commande

 find ./ -name "*.txt" | xargs -I '{}' basename '{}' | sed 's/\.txt//' | xargs -I '{}' mv '{}.txt' '{}.md' 

J’ai eu un problème similaire où les fichiers ont été nommés .gifx.gif à la fin et cela a fonctionné dans OS X pour supprimer le dernier .gif :

 for old in *.gifx.gif; do mv $(echo "$old") $(echo "$old" | sed 's/x.gif//'); done 
  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 

Pour ceux d’entre vous qui ne sont pas vraiment bons en programmation, vous pouvez consulter cet article sur wiki comment .
Il montre beaucoup de méthodes pour le faire sans codage
et vous pouvez également consulter cet article de blog sur la modification des extensions de fichiers .
Il contient une application console qui fait tout pour vous.