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
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.
#!/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))
copyandrename.py
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!
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.