Étant donné les fichiers suivants:
english_api
english_overview
style.css
Je veux obtenir:
english_api.html
english_overview.html
style.css
En d'autres termes, comment ajouter un texte à tous les fichiers ne contenant pas de point (.
) dans un répertoire à l'aide de terminal.
De toute évidence, il y a beaucoup de fichiers dans ce dossier; Je viens d'écrire 3 à titre d'exemple.
Si je devais, disons, remplacer .css
par .html
dans ce dossier, j'utiliserais:
rename .css .html *.css
Mais je ne peux pas vraiment penser à un moyen de faire correspondre des fichiers qui ne contiennent pas quelque chose. Aussi, comment ajouter (vs remplacer) en utilisant la commande rename
?
Essayez cette commande find
,
find . -type f ! -name "*.*" -exec mv {} {}.html \;
Il renomme les fichiers qui ne contiennent pas de points dans leurs noms de fichiers présents dans le répertoire actuel en ce filename.html
format (ajouté .html
au dernier).
.
-> Représente le répertoire actuel
-type f
-> Pour effectuer cette opération uniquement sur des fichiers.
! -name "*.*"
-> affiche le nom des fichiers ne comportant pas de points.
La commande -exec mv {} {}.html
-> find
effectue cette opération de déplacement (ou) de changement de nom sur les noms de fichiers extraits.
\;
-> Représente la fin de la commande find
.
En bash, vous pouvez utiliser global Shell globs p. Ex.
for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done
(Supprimez le echo
une fois que vous avez vérifié qu'il correspond au modèle correct). Si la navigation étendue n'est pas déjà activée, vous pouvez l'activer avec shopt -s extglob
.
Une autre option consiste à utiliser la fonction rename
à base de Perl avec une expression régulière excluant le littéral .
rename -nv 's/^[^.]+$/$&.html/' path/to/files/*
(Supprimez l'option n
une fois que vous avez confirmé qu'elle correspond au modèle correct).
Mon préféré dans de tels cas est mmv
. Il n'est pas installé par défaut dans Ubuntu, mais vous pouvez l'installer à l'aide de la commande _Sudo apt-get install mmv
_.
Dans votre cas, vous devez l'utiliser deux fois:
Renommez tous les fichiers du répertoire en cours en ajoutant _.html
_ à la fin de chaque nom de fichier:
_mmv -v '*' '#1.html'
_
Renommez à nouveau (en arrière) tous les fichiers qui avaient auparavant dans leurs noms un ou plusieurs _.
_ (points):
_mmv -v '*.*.html' '#1.#2'
_
Ou, en une ligne:
_mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'
_
L'option _-v
_ n'est pas obligatoire. Je ne l'utilise que pour une sortie prolixe, car sans elle, mmv
effectue des actions en silence.
Voir man mmv
pour plus d'informations.
Avec la commande Perl rename ( prename
), vous pouvez ajouter une condition selon laquelle le nom du fichier doit contenir un point. Si l'extrait de code Perl ne modifie pas le nom d'un fichier, ce fichier n'est pas modifié. Voici quelques façons d'écrire ceci:
prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *