2016-07-22 12 views
-1

Ich habe ein Quellverzeichnis mit Unterverzeichnissen mit Dateien. Ich habe auch ein Zielverzeichnis mit Unterverzeichnissen mit einer anderen Struktur.Suche nach fehlenden Dateinamen in verschachtelter Dateistruktur

fileNames = <get all file names from source directory> 
for fileName in fileNames { 
    if <not found in destination directory> { 
     print fileName 
    } 
} 

Wie kann ich Pseudocode oben tun?

EDIT:

Example file structure: 
./sourcedir/file1.txt 
./sourcedir/foldera/file2.txt 
./sourcedir/foldera/missingfile.txt 

./destdir/file2.txt 
./destdir/folderb/file1.txt 

So sollte missingfile.txt gedruckt werden. Aber nicht file1.txt oder file2.txt, da sie irgendwo unter destdir zu finden sind.

EDIT2: Ich schaffte es, eine Python-Implementierung zu machen, das war, was angestrebt wurde. Ich hatte einige Probleme mit den Bash-Antworten, wenn ich sie probierte. Kann es in bash einfacher gemacht werden?

import os 
import fnmatch 

sourceDir = "./sourcedir" 
destinationDir = "./destdir" 

def find_files(directory, pattern): 
    for root, dirs, files in os.walk(directory): 
     for basename in files: 
      if fnmatch.fnmatch(basename, pattern): 
       filename = os.path.join(root, basename) 
       yield filename 

print sourceDir 
for sourcefilename in find_files(sourceDir, '*'): 
    #if not sourcefilename.lower().endswith(('.jpg', '.jpeg', '.gif', '.png','.txt','.mov','3gp','mp4','bmp')): 
    # continue 
    shouldPrint = True 
    for destfilename in find_files(destinationDir, '*'): 
     sourceBaseName = os.path.basename(sourcefilename) 
     destBaseName = os.path.basename(destfilename) 
     if sourceBaseName == destBaseName: 
      shouldPrint = False 
      break 
    if shouldPrint: 
     print 'Missing file:', sourcefilename 
+0

Sie haben dies als [tag: bash] und [tag: python] getaggt. Ordnen Sie Tags zufällig zu oder benötigen Sie eine spezifische Lösung in einer dieser Sprachen (warum?)? – tripleee

+0

Guter Punkt. Ich hätte sofort gedacht, dass diese beiden Tags sinnvoll sind, damit ich die Antwort leichter verstehen kann. Vielleicht ist es besser, bei einer Sprache zu bleiben, um zu vermeiden, dass Dinge zu sehr gemischt werden. – user317706

Antwort

1

Mit bash kann dies einfach durch Ausführen von diff -r source_dir target_dir | grep Only.*source_dir | awk '{print $4}' durchgeführt werden.

  • diff -r source_dir target_dir zeigt die Unterschiede zwischen source_dir und target_dir
  • grep Only.*source_dir werden alle Dateien bestehenden im Quellverzeichnis herauszufiltern, aber nicht im Zielverzeichnis
  • awk '{print $4}' wird den Dateinamen
0

herauszufiltern Ein bisschen ein Hack, aber Sie könnten etwas mit find und diff tun, kein Python benötigt:

Diese vergleicht die Liste der Dateien in sourcedir mit den in destdir und dann druckt nur die Dateien, die in sourcedir existieren, aber nicht in destdir.

Verwandte Themen