web-dev-qa-db-fra.com

Comment copier des fichiers de plusieurs répertoires, en ajoutant le nom du dossier parent au nom du fichier?

J'ai examiné toutes les réponses possibles à propos de "copier un fichier de plusieurs répertoires dans un seul répertoire", mais je ne trouve pas ma réponse. J'ai besoin de quelque chose de légèrement plus spécifique pour le traitement de ma base de données.

J'ai une question similaire à:

copier des fichiers de plusieurs répertoires dans un autre répertoire

mais comment puis-je copier ces fichiers (ils ont tous exactement le même nom) dans un nouveau répertoire et leur ajouter le nom du répertoire parent, afin que je puisse reconnaître à partir de quel répertoire ils ont été copiés?

Oui, je pourrais copier et renommer les noms les uns après les autres, si je n'en avais pas 100 :)

J'ai essayé des boucles avec find. etc, mais je ne peux toujours pas ajouter les fichiers copiés au nom du répertoire des parents.

Je suis encore junior dans ce domaine et je commence donc avec regex. Je suppose qu’il ya quelque chose à faire avec eux, mais je ne peux pas comprendre comment exactement.

Donc, voici ma question graphiquement. Comment faire cela avec une simple commande, ou une boucle, sur mon terminal unix:

DIR_a1 --> output_file.bam
DIR_a2 --> output_file.bam                              
DIR_a3 --> output_file.bam  

Copiez tous les output_files.bam dans NEWDIR_output afin qu'ils apparaissent avec le nom du répertoire parent:

output_file_a1.bam
output_file_a2.bam                              
output_file_a3.bam

Par avance, très reconnaissant pour toute contribution

1
Marylaure

Copier des fichiers d'une source dans un répertoire cible, en ajoutant le nom du dossier contenant au fichier

Le script ci-dessous va copier les fichiers récursivement d'un répertoire source dans un répertoire plat, en ajoutant le nom du répertoire supérieur (direct) au nom du fichier. Le nom du répertoire sera inséré avant extension possible sur le fichier, exactement comme votre exemple.

Le scénario

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

for root, dirs, files in os.walk(sys.argv[1]):
    for f in files:
        # split off the superior directory's name
        dirname = root.split("/")[-1]
        # define file+path, possible extension position
        src = os.path.join(root, f); spl = f.rfind(".")
        # defining new filename
        newname = f[:spl]+"_"+dirname + f[spl:] if spl != -1 else f+"_"+dirname
        # copy the file into the new directory
        shutil.copyfile(src, os.path.join(sys.argv[2], newname))

Comment utiliser

  1. Copiez le script intyo dans un fichier vide, enregistrez-le sous le nom copyandrename.py
  2. Exécutez-le avec les répertoires source et cible comme arguments:

    python3 /path/to/copyandrename.py <source_directory> <target_directory>
    

    Ma commande de test était par exemple.

    python3 '/home/jacob/Bureaublad/pscript_4.py' '/home/jacob/Bureaublad/testmap' '/home/jacob/Bureaublad/target'
    

Comme toujours, veuillez d'abord tester un échantillon!

2
Jacob Vlijm

Vous devriez pouvoir le faire en utilisant les fonctions de substitution de paramètres de Shell, par exemple.

$ for d in DIR_a*; do echo cp -- "$d/output_file.bam" "NEWDIR_OUTPUT/output_file${d#DIR}.bam"; done
cp DIR_a1/output_file.bam NEWDIR_OUTPUT/output_file_a1.bam
cp DIR_a2/output_file.bam NEWDIR_OUTPUT/output_file_a2.bam
cp DIR_a3/output_file.bam NEWDIR_OUTPUT/output_file_a3.bam

Supprimez la echo une fois que vous avez vérifié qu’elle fait le bon choix.

2
steeldriver