2014-09-15 6 views
0

J'ai trouvé un example comment déplacer tous les fichiers de manière récursive, mais je voudrais conserver la même structure de dossiers dans le dossier de destination.trouver des fichiers récursifs avec python

import fnmatch 
import os 
import shutil 

rootPath = '/Volumes/VoigtKampff/Temp/TEST/' 
destDir = '/Volumes/VoigtKampff/Temp/TEST2/' 


matches = [] 
for root, dirnames, filenames in os.walk(rootPath): 
    for filename in fnmatch.filter(filenames, '*.mp4'): 
     matches.append(os.path.join(root, filename)) 
     print(os.path.join(root, filename)) 
     shutil.move(os.path.join(root, filename), os.path.join(destDir, filename)) 

Comment est-il possible de modifier le code ci-dessus pour maintenir la même structure de dossiers dans le dossier de destination?

+0

Utilise mv hors de question? – xavier

Répondre

2

(Cette réponse suppose que vous travaillez dans 2.x Python)

Vous devez faire les sous-répertoires que vous allez:

import fnmatch 
import os 
import shutil 

rootPath = '/Volumes/VoigtKampff/Temp/TEST/' 
destDir = '/Volumes/VoigtKampff/Temp/TEST2/' 

matches = [] 

for root, dirnames, filenames in os.walk(rootPath): 
    for filename in fnmatch.filter(filenames, '*.mp4'): 
     matches.append(os.path.join(root, filename)) 
     print(os.path.join(root, filename)) 
     targetDir = os.path.join(destDir, root[len(rootPath):]) 
     if not os.path.exists(targetDir): 
      os.makedirs(targetDir) 
     shutil.move(os.path.join(root, filename), os.path.join(targetDir, filename)) 

Notez également que les noms de camelCase ne sont pas pratique courante en Python. Jetez un oeil à PEP8: http://legacy.python.org/dev/peps/pep-0008/

+0

En python3, 'os.makedirs' inclut un drapeau' exist_ok' qui contourne la condition de concurrence présente ici –

+0

@AdamSmith - bon point; Je supposais un scénario Python 2.x ici. – JKesMc9tqIQe9M

+0

juste remarqué l'impression(), donc je suppose que cela aurait dû être Python 3 après tout! – JKesMc9tqIQe9M

0

Pourquoi ne pas simplement faire os.system('your mv command')?

+1

Peut-être indépendant de l'OS? –

1

Pour déplacer tous les fichiers de .mp4root_dir répertoire dest_dir répertoire récursive tout en préservant la structure répertoire par rapport à root_dir:

#!/usr/bin/env python3 
from pathlib import Path 
from shutil import move 

src = Path(root_dir) 
dest = Path(dest_dir) 
for file in src.rglob('*.mp4'): 
    dest_file = dest/file.relative_to(src) 
    try: 
     dest_file.parent.mkdir(parents=True) 
    except OSError: 
     pass # ignore 
    move(str(file), str(dest_file)) 

Il utilise la bibliothèque pathlib qui est disponible dans stdlib depuis Python 3.4. Pour l'installer sur les versions antérieures:

$ pip install pathlib 
Questions connexes