web-dev-qa-db-fra.com

renommer plusieurs fichiers avec des délimiteurs

Comment pourrais-je renommer plusieurs fichiers comme,

IonXpress_049.T11014.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam
IonXpress_050.T11114.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam

À,

T11014.bam 
T11114.bam
4
Vonton

Il existe plusieurs façons de renommer à partir de la ligne de commande. Voici un one liner. Allez dans le répertoire où se trouvent les fichiers .bam et essayez ceci,

for i in *.bam; do mv "$i" "$(echo $i | awk -F"." '{print $2}').bam"; done

Comment ça fonctionne:

  • En utilisant une boucle for et un glob shell interceptant les fichiers désirés,
 pour i dans * .bam 
 faire 
 mv destination source 
 fait 
  • Ensuite, extrayez la partie que vous souhaitez conserver, à savoir le deuxième champ de la chaîne séparé par . à l'aide de awk comme,
 $ echo IonXpress_049.T11014.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam | awk -F "." '{print $ 2}' 
 $ T11014 

On peut utiliser un séparateur de champs personnalisé à l’aide de l’option -F. Voir man awk pour plus d'informations.

6
souravc
rename 's/.*?\.([^.]+).*/$1.bam/' *.bam -vn

Supprimez le -vn lorsque vous pouvez le voir faire ce que vous voulez. Voici mon harnais de test:

$ touch 34234234kh.TESTING00{1..3}.234978623478y234.bam
$ rename 's/.*?\.([^.]+).*/$1.bam/' *.bam -vn
34234234kh.TESTING001.234978623478y234.bam renamed as TESTING001.bam
34234234kh.TESTING002.234978623478y234.bam renamed as TESTING002.bam
34234234kh.TESTING003.234978623478y234.bam renamed as TESTING003.bam
8
Oli

Vous pouvez utiliser le merveilleux programme krename:

Sudo apt-get install krename

Dans ce programme, vous avez un résultat preview, et vous pouvez notamment utiliser une certaine plage de masques de noms de fichiers:

enter image description here

Le masque est à. Voir les noms de fichier originaux en et les noms futurs en. Si cela vous semble correct, vous pouvez appuyer sur terminer: ➃ - ce n’est qu’après cela que les fichiers seront renommés.

4
Adobe

Utilisez la commande find pour rechercher tous les fichiers *.bam et pour lire tous les fichiers un par un, puis finalement avec la commande mv et les renommer en noms de votre choix.

find /path/to/maindir -type f -name "*.bam" -print0 | while IFS= read -d '' -r file
do
    echo mv -v "$file" /path/to/maindir/"$(awk -F'.' '{print $2".bam"}'<<< "$file")";
done

Résultat:

mv -v /home/USER/maindir/IonXpress_049.T11014.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam /home/USER/maindir/T11014.bam
mv -v /home/USER/maindir/IonXpress_050.T11114.R_2014_11_13_11_26_35_user_PR2-41-Pooling0026_3140_13112014.bam /home/USER/maindir/T11114.bam

Si vous avez coché le résultat, supprimez la commande echo à renommer réellement.

3
αғsнιη

En admettant que

  • le nom désiré "corps" est toujours après le premier point
  • l'extension .bam est toujours présente
  • le répertoire est "plat" et n'a pas de sous-répertoires

Cette solution python devrait faire l'affaire. Le nombre de sections peut varier, cela fonctionnerait quand même:

#!/usr/bin/env python3

import os
import shutil
import sys

directory = sys.argv[1]

for item in os.listdir(directory):
    if not item.startswith("."):
        edit = item.split("."); newname = (".").join([edit[1], edit[-1]])
        if len(edit) > 2:
            shutil.move(directory+"/"+item, directory+"/"+newname)

Copiez-le dans un fichier vide, rendez-le exécutable (pour l'exécuter sans le préfixe python3) et exécutez-le à l'aide de la commande suivante:

</path/to/script> <directory_with_files>

Pour que:

monkey.banana.peanut.bam

devient

banana.bam

et

monkey.Apple.peaunt.another_string.and_alot_more.bam

devient

Apple.bam

tandis que

something.bam

est laissé seul.

2
Jacob Vlijm

Une autre solution python via le module re.

script.py

#!/usr/bin/python3
import sys
import re
import os
import shutil

directory = sys.argv[1]
for item in os.listdir(directory):
    if '.' in item:
        newname = re.sub(r'^[^.]+\.([^.]*).+(\.bam)', r'\1\2', item)
        shutil.move(directory+"/"+item, directory+"/"+newname)

Comment courir?

python3 script.py /path/to/the/directory/where/the/files/you/want/to/rename/are/stored
1
Avinash Raj

Bien que toutes ces réponses soient bonnes, je souhaite vous montrer une méthode qui ne nécessite pas de programmation (et peut être beaucoup plus rapide si vous avez déjà installé Sublime Text)

  • Installez Sublime Text ( http://www.sublimetext.com/ ) Installez le
  • Contrôle de package sublime ( https://packagecontrol.io/installation )
  • Installer le paquet FileBrowser (ctrl+shif+p> Installer le paquet> FileBrowser http://github.com/aziz/SublimeFileBrowser )
  • Configurez le raccourci clavier FileBrowser (ctrl+shift+p> Utilisateur de liaisons clés), par exemple.

    { "keys": ["f1"], "command": "dired", "args": { "immediate": true } }

  • démarrer le FileBrowser (F1)

  • multisélectionnez vos fichiers (sélectionnez un modèle commun> ctrl+d)
  • entrer en mode renommer (shift+R)
  • modifier comme un éditeur de texte commun (par exemple, ctrl+right pour passer d'un mot à l'autre)
  • appliquer renommer avec Enter
0
select