Ajouter du texte aux noms de fichiers qui ne contiennent pas de point

9

É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 qui ne contiennent pas de point ( .) dans un répertoire à l'aide de terminal.

Évidemment, il y a beaucoup de fichiers dans ce dossier; Je viens d'écrire 3 comme exemple.

Si je devais, disons, remplacer .csspar .htmldans 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 renamecommande?

Bor691
la source

Réponses:

13

Essayez cette findcommande,

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 courant à ce filename.htmlformat ( ajouté .htmlau dernier ).

. -> Représente le répertoire courant

-type f -> Pour effectuer cette opération uniquement sur les fichiers.

! -name "*.*" -> affiche le nom des fichiers qui n'ont pas de points dans leur nom.

-exec mv {} {}.html -> La findcommande effectue cette opération de déplacement (ou) de changement de nom sur les noms de fichiers extraits.

\; -> Représente la fin de la findcommande.

Avinash Raj
la source
6

En bash, vous pouvez utiliser des globes shell étendus, par exemple

for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; done

(supprimez le echoune fois que vous avez confirmé qu'il correspond au modèle correct). Si la globalisation étendue n'est pas déjà activée, vous pouvez l'activer avec shopt -s extglob.

Une autre option utilise la renamefonction basée sur Perl avec une expression régulière qui exclut littéral.

rename -nv 's/^[^.]+$/$&.html/' path/to/files/*

(supprimez l' noption une fois que vous avez confirmé qu'elle correspond au modèle correct).

tournevis
la source
for file in path/to/files/!(*.*); do echo mv "$file" "$file.html"; doneLa commande renomme également les répertoires.
Avinash Raj
2

Mon préféré dans des cas comme celui-ci est mmv. Il n'est pas installé par défaut dans Ubuntu, mais vous pouvez l'installer à l'aide de la sudo apt-get install mmvcommande.

Dans votre cas, vous devez l'utiliser deux fois:

  1. Renommez tous les fichiers du répertoire actuel 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 précédemment dans leur nom un ou plusieurs .(points):

    mmv -v '*.*.html' '#1.#2'
    

Ou, en une seule ligne:

mmv -v '*' '#1.html' && mmv -v '*.*.html' '#1.#2'

-vl'option n'est pas obligatoire. Je l'utilise uniquement pour une sortie détaillée car sans elle, il mmveffectue des actions en silence.

Voir man mmvpour plus d'informations.

Radu Rădeanu
la source
1

Avec la commande Perl rename ( prename), vous pouvez ajouter une condition selon laquelle le nom de fichier doit contenir un point. Si l'extrait de code Perl ne modifie pas le nom d'un fichier, ce fichier reste intact. Voici quelques façons d'écrire ceci:

prename '/\./ or s/$/.html/' *
prename 's/$/.html/ unless /\./' *
prename '$_ .= ".html" unless /\./' *
prename '$_ = "$_.html" unless /\./' *
prename 'if (!/\./) {$_ = "$_.html"}' *
Gilles 'SO- arrête d'être méchant'
la source
-2

Les réponses sont parfaites, je vous donne également une autre commande qui fait ce travail:

ls -1 | grep -v "\." | awk '{print "mv "$0" "$0".html"}' | sh

Quelques explications:

ls - list directory contents

 -1     list one file per line

grep prints the matching lines.

-v, --invert-match
              Invert the sense of matching, to select non-matching lines.  (-v
              is specified by POSIX.)

Awk is mostly used for pattern scanning and processing. It searches one or more files to see if they contain lines that matches with the specified patterns and then perform associated actions.

REMARQUE :

J'essaie votre scénario et la commande fait le boulot.

nux
la source
6
Cela échoue sur les noms de fichiers qui contiennent tout type d'espaces (espaces, tabulations, sauts de ligne, etc.). En règle générale, vous ne devez jamais analyserls .
terdon
C'est vrai terdon merci pour votre commentaire, mais comment puis-je résoudre ce problème dans la même commande
nux
3
Tu ne peux pas vraiment. Il n'y a presque aucun moyen sûr d'analyser ls. Si vous voulez vraiment le faire en utilisant awket sh, essayez quelque chose comme printf "'%s'\n" -- !(*.*) | awk '{print "mv -- "$0" "$0".html"}' | sh. Cela cassera toujours les noms de fichiers avec des sauts de ligne mais au moins cela peut traiter les espaces. Le --est nécessaire pour les cas où vous avez des noms de fichiers commençant par -.
terdon