comment changer les extensions de fichiers dans un répertoire [fermé]

4

J'ai beaucoup de fichiers dans un répertoire ayant une extension.

.text(2)
.text(1)

Je veux supprimer les numéros de l’extension et la sortie devrait être comme

.text 
.text

Quelqu'un peut-il s'il vous plaît m'aider avec le script shell pour cela? J'utilise CentOs 6.3.

    
posée vishal 10.06.2015 - 09:33
la source

4 réponses

8

Démarrez le one-liner dans le dossier où les fichiers sont enregistrés ou modifiez le chemin de la commande find . Dans les exemples suivants, find . le chemin est . (point).

Testez avec:

find . -type f -print0 | xargs -I{} -0 rename -v -n  's/\([0-9]+\)$//' {}

Renommer avec:

find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)$//' {}

La commande recherche tous les fichiers de manière récursive et supprime toutes les occurrences de (<any_number>) à la fin du nom de fichier.

Supprimez $ in 's/\([0-9]+\)$//' pour supprimer toutes les occurrences du nom de fichier, par exemple:

find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)//' {}

Exemple:

% ls -oga
-rw-rw-r--  1 0 Jun 10 09:34 .foo(1)
-rw-rw-r--  1  0 Jun 10 09:34 .bar(2)
% find . -type f -print0 | xargs -I{} -0 rename -v  's/\([0-9]+\)$//' {}
% ls -aog
-rw-rw-r--  1    0 Jun 10 09:34 .foo
-rw-rw-r--  1    0 Jun 10 09:34 .bar
    
réponse donnée A.B. 10.06.2015 - 09:41
la source
0
for i in *.text*; do mv "$i" "$(echo "$i" | sed 's/([0-9]\{1,\})$//')"; done 

juste besoin de changer l’extension (.text ou toute autre extension) en fonction des besoins.

    
réponse donnée vishal 10.06.2015 - 13:43
la source
0

Utilisation de python :

#!/usr/bin/env python2
import os, re
for root, dirs, files in os.walk('/path/to/directory'):
    for f in files:
        oldname = os.path.join(root, f)
        newname = os.path.join(root, re.search(r'(?<=/)[^/]+(?=\(\d+\)$)', oldname).group())
        os.rename(oldname, newname)

Considérer que la première partie des noms de fichiers est différente (comme vous l’avez déjà mentionné), donc pas de risque d’écrasement.

  • os.walk parcourra tous les sous-répertoires du répertoire mentionné

  • oldname contiendra le nom du fichier à modifier. os.path.join ajoutera le nom du fichier avec le chemin du répertoire par os.path.join

  • newname contiendra le nom auquel oldname sera modifié. Ici, nous avons utilisé le module re pour obtenir le nom du fichier, puis ajouté le nom de fichier au chemin d'accès au répertoire par os.path.join

  • os.rename va simplement renommer les fichiers en conséquence.

Avant:

foo
├── 1 spam.text(1)
├── 1.text(23)
└── bar
    ├── 1 egg.text(10)
    └── 3test.text(5)

Après:

foo
├── 1 spam.text
├── 1.text
└── bar
    ├── 1 egg.text
    └── 3test.text
    
réponse donnée heemayl 10.06.2015 - 14:04
la source
-1

Ceci est un "commentaire supplémentaire" et non une réponse complète par lui-même.

Il s’agit d’un très long moyen d’expliquer un concept mineur - il apparaîtra long et pédant sauf si le lecteur a manqué le but.

Résumé succinct:

S'il y a plus d'un fichier de nom comme foo.txt [(n)]

  • foo.txt, foo.txt (1) - renommer - & gt; pas de changement
    Apparaît que rien ne s'est passé. C'est fait.

  • foo.txt (1), foo.txt (2) - renommer - & gt; foo.txt, foo.txt (2) (probablement)
    Un fichier renommé, un pas.

Plus long:

Vous dites que vous n’avez pas de fichiers en double.
Vous pouvez être correct
MAIS - ce qui suit est trivialement évident si vous le connaissez, mais un piège subtil si vous ne l’avez pas déjà rencontré.

En ce qui concerne le système

foo.txt = = foo.txt (1) = = foo.txt (2) = etc

indépendamment du contenu ou de la taille du fichier.

ie Si vous avez deux fichiers nommés foo.txt avec ou sans (n) après, le système pense qu'ils sont des doublons et / ou des doublons.
De toute façon, un processus de renommage échouera.

Si le processus de changement de nom crée deux fichiers portant le même nom, il échouera lorsque vous tenterez de créer le premier doublon. Mais

Dans un cas, l’échec ne créera aucune sortie, il apparaîtra que "rien ne s’est produit" alors qu’en réalité "une copie a échoué en raison d’une collision de noms" s’est produite. Ce cas se produit quand un fichier n'a pas de suffixe (n) et un autre a.
Par exemple, si les fichiers existants sont foo.txt et foo.txt (1), alors le renommage de foo.txt (1) créerait un doublon si cela est autorisé et ne se produirait pas. Aucune action n'aura lieu.
foo.txt, foo.txt (1) - & gt; pas de changement

Mais si les fichiers existants sont par exemple foo.txt (1) et foo.txt (2) alors le renommage de foo.txt (1) ne créerait PAS de doublon donc se produira MAIS le renommage de foo.txt (2) par la suite, créerait un doublon si cela est autorisé, de sorte qu'aucune action de renommage du deuxième fichier n'aura lieu.
foo.txt (1), foo.txt (2) - & gt; foo.txt, foo.txt (2) (probablement)

    
réponse donnée Russell McMahon 10.06.2015 - 13:35
la source

Lire d'autres questions sur les étiquettes