web-dev-qa-db-fra.com

Modification des extensions de fichier pour tous les fichiers d'un répertoire sous OS X

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 que je peux utiliser pour convertir tous les fichiers de ce répertoire en une autre extension?

Ou dois-je écrire un script avec une expression régulière?

60
Ben McCormick

Vous pouvez utiliser quelque chose comme ceci:

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

Faites une copie d'abord!

125
Pascal Belloncle

Vous pouvez également installer l'utilitaire ren (renommer)

brew install ren

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

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

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

Le terminal n’est pas nécessaire pour cela ... Mettez en surbrillance tous les fichiers que vous souhaitez renommer. Faites un clic droit et sélectionnez "Renommer ## éléments" et tapez simplement ".txt" dans la zone "Rechercher:" et ".md" dans la zone "Remplacer par:".

42
Vicky

La méthode Unix préférée pour le faire (oui, OS X est basé sur Unix) est la suivante:

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

Pourquoi boucler avec for si ls de par sa conception parcourt toute la liste des noms de fichiers? Vous avez des pipes, utilisez-les. Vous pouvez créer/modifier non seulement la sortie à l'aide de commandes, mais aussi de commandes (à droite, c'est-à-dire les commandes créées par une commande, ce que Brian Kernighan, l'un des inventeurs d'Unix, apprécie le plus sous Unix). le ls et le sed produisent en supprimant le tuyau vers 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 constater, il ne s’agit pas uniquement d’une ligne, mais également d’un script complet, qui fonctionne en outre en créant un autre script en sortie. Alors alimentons simplement le script produit par le script one-liner dans sh, qui est l'interpréteur de script = d'OS X. Bien sûr, cela fonctionne même pour les noms de fichiers contenant 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 seul mot comme ls ou date etc. dans un shell Unix, il s'agit toujours d'un script/programme, qui n'est qu'un flux basé sur ASCII (dans ce cas, un flux d'instructions opposé à un flux de données).

Pour voir les commandes en cours d'exécution par sh, ajoutez simplement un -x option après sh, qui active la sortie de débogage dans le shell, vous verrez ainsi chaque commande mv exécutée avec les arguments réels passés par le script d’éditeur sed ( oui, un autre script à l'intérieur du script :-)).

Cependant, si vous aimez la complexité, vous pouvez même utiliser awk et si vous souhaitez installer d'autres programmes uniquement pour effectuer un travail de base, il existe ren. Je connais même des gens qui préféreraient écrire un script de 50 lignes ou plus Perl pour cette tâche simple et quotidienne.

Il est peut-être plus facile dans le Finder de renommer des fichiers, mais s’il est connecté à distance à un Mac (par exemple via ssh), l’utilisation du Finder n’est pas du tout possible. C'est pourquoi la ligne de commande est toujours très utile.

8
LBC

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

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 une mise en forme de code propre dans un commentaire sur cette réponse.)

4
James Tomasino

J'ai eu un problème similaire où les fichiers étaient nommés .gifx.gif à la fin et cela fonctionnait sous OS X pour supprimer le dernier .gif:

for old in *.gifx.gif; do
    mv $(echo "$old") $(echo "$old" | sed 's/x.gif//');
done
1
Ken Richardson

Pas besoin d'écrire un script car il suffit d'appuyer sur cette commande

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

Pour ceux d'entre vous qui ne sont pas vraiment bons en programmation, vous pouvez consulter cet article sur wiki how .
Il montre de nombreuses méthodes pour le faire qui ne nécessitent pas de codage
et vous pouvez également consulter cette publication sur changer les extensions de fichier .
Il contient une application console qui s'occupe de tout.

0
Ravened writer
    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
Manish Ranjan