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?
Vous pouvez utiliser quelque chose comme ceci:
for old in *.txt; do mv $old `basename $old .txt`.md; done
Faites une copie d'abord!
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'
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:".
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.
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.)
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
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'
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.
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