2017-01-11 2 views
1

Ich habe eine Liste von 500.000 Dateien und deren Pfade, die ich in ein neues Verzeichnis verschieben muss, aber die Ordnerstruktur beibehalten.Verschieben von Dateien mit Liste in neues Verzeichnis unter Beibehaltung des ursprünglichen Unterverzeichnisses mit R

> head(list.of.files) 
    [1] "F:\\Client X/Geochem/all.txt"                     
    [2] "F:\\Client X/Geochem/Rock Sample.xlsx"        
    [3] "F:\\Client X/Geochem/DataDump/2006 Humus Sampling/every5.txt" 
    > 

Ich habe versucht File.Copy mit, dies zu tun, aber alle Dateien kopieren Sie auf einen einzelnen Zielordner, ohne die Unterverzeichnisstruktur zu halten. Der Grund, warum ich dies mit einer Liste mache, ist, dass ich nur bestimmte Dateien aus den Originalordnern verschiebe. Ich habe alle Beiträge dazu gelesen, aber ich kann keine Frage finden, die zu diesem speziellen Problem passt. Meine letzte Ordnerstruktur sollte wie folgt aussehen:

[1] "F:\\Client X Copy/Client X/Geochem/all.txt" 
    [2] "F:\\Client X Copy/Client X/Geochem/Rock Sample.xlsx" 
    [3] "F:\\Client X Copy/Client X/Geochem/DataDump/2006 Humus Sampling/every5.txt" 

Hier ist der Code, die ich verwendet:

current.folder <- "F:\\Client X" 
    new.folder <- "F:\\Client X Copy" 
    list.of.files <- list.files(current.folder,full.names=TRUE, recursive = TRUE) 
    file.copy(list.of.files, new.folder) 

Irgendwelche Vorschläge enorm geschätzt werden würde!

+0

Vielleicht funktioniert das rekursive = TRUE Argument in 'file.copy'. – lmo

+0

Nein, die Dateien werden leider alle in den Stammordner verschoben und erstellen keine Unterordner. –

+0

Bumm. Ich bin mir nicht sicher, was das rekursive = TRUE Argument in 'dir.create' tut, aber es kann einen Versuch wert sein. – lmo

Antwort

1

file.copy nicht Verzeichnisstruktur nachzubilden, mithilfe von xcopy DOS-Befehl auf Windows-Plattform gelöst werden können, leer Verzeichnisstruktur erstellen. Ich habe dies unter Windows für winzige Test Fällen getestet und funktioniert gut. (rysnc in * nix-Plattformen den gleichen Zweck dienen, nicht getestet)

Erstellen von Dateipfaden:

list.of.files = c(
"F:\\Client X/Geochem/all.txt"                     
,"F:\\Client X/Geochem/Rock Sample.xlsx"        
,"F:\\Client X/Geochem/DataDump/2006 Humus Sampling/every5.txt") 

list.of.files 
#[1] "F:\\Client X/Geochem/all.txt"         
#[2] "F:\\Client X/Geochem/Rock Sample.xlsx"      
#[3] "F:\\Client X/Geochem/DataDump/2006 Humus Sampling/every5.txt" 

#Use gsub to edit destination paths 

list.of.dest.files = gsub("Client X","Client X Copy",list.of.files) 
list.of.dest.files 
#[1] "F:\\Client X Copy/Geochem/all.txt"         
#[2] "F:\\Client X Copy/Geochem/Rock Sample.xlsx"      
#[3] "F:\\Client X Copy/Geochem/DataDump/2006 Humus Sampling/every5.txt" 

Replizieren Baum strcuture:

#Create directory tree structure without copying any files 
#https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/xcopy.mspx?mfr=true 
#Note the usage of single and double quotes to address issue of white space 
#in file paths 

system('xcopy "F:\\Client X" "F:\\Client X Copy" /t') 

#unix equivalent 
#http://serverfault.com/questions/204303/how-do-i-copy-a-directory-tree-but-not-the-files-in-linux 
#system("rsync -av -f"+ */" -f"- *" /path/to/src /path/to/dest/") 

Dateien kopieren:

for(i in 1:length(list.of.files)){ 
cat("Copying file:",list.of.files[i],"\n") 
file.copy(list.of.files[i],list.of.dest.files[i]) 
} 

Würde babun unter Windows sehr empfehlen, es hat eine ausgezeichnete Emulation von Unix-Umgebung mit nützlichen Werkzeugen wie cp und mv (Datei kopieren/verschieben), find und grep (search files/dir), diff (Unterschiede in Dateien) , du (Datenträgerverwendung) usw.

+0

Diese Lösung funktioniert perfekt. Vielen Dank für die Babun-Empfehlung und die geniale Lösung. Sehr geschätzt. –

Verwandte Themen