web-dev-qa-db-fra.com

Ajouter du texte aux noms de fichiers ne contenant pas de point

É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?

9
Bor691

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.htmlformat (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.

13
Avinash Raj

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).

6
steeldriver

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:

  1. Renommez tous les fichiers du répertoire en cours en ajoutant _.html_ à la fin de chaque nom de fichier:

    _mmv -v '*' '#1.html'
    _
  2. 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.

2
Radu Rădeanu

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"}' *
1
Gilles