2016-05-10 6 views
-1

Ich habe das folgende Problem: Ich habe einen Ordner (Stammordner), der eine Menge Dateien und Unterordner enthält. Jeder Unterordner enthält eine Reihe von Dateien (beliebigen Typs). Ich möchte alle Unterordner reduzieren, um den Stammordner zu haben, der die Dateien enthält, die zuvor in den Unterordnern gespeichert wurden. Zum Beispiel habe ich: Main_folder File1 File2 SubFolder1 File3 Subfolder2 Datei4Flachen Unterordner Matlab

Ich möchte erhalten: Main_folder File1 File2 File3 Datei4

Gibt es eine Möglichkeit, das zu tun automatisch in Matlab?

+2

Was ist Ihre Umgebung? Windows? Mac? Linux? Für Mac/Linux würde ich das mit einem Bash-Shell-Skript machen. Das ist nicht wirklich was Matlab für ... –

+0

Es gibt buchstäblich Tausende von Möglichkeiten, dies mit verschiedenen Tools zu tun ... – Matt

+0

ok, können Sie mir bitte eine Methode sagen? Kennst du keine Matlab-Methode dafür? Vielen Dank – David

Antwort

0

Sie können dies in MATLAB leicht zu tun, eine Kombination aus dir mit einem Verzeichnisliste zu bekommen, fullfile Pfade zu konstruieren, movefile die Dateien auf ihren neuen Platz zu bewegen.

Zuerst das folgende Skript auf einem Kopie Ihrer Daten im Fall führen Sie es irgendwelche Probleme hat

function flattenFolder(folder, destination) 
    if ~exist('destination', 'var') 
     destination = folder; 
    end 

    %// Get a list of everything in this folder 
    D = dir(folder); 

    %// Grab just the directories and remove '.' and '..' 
    folders = {D([D.isdir]).name}; 
    folders = folders(~ismember(folders, {'.', '..'})); 

    %// Get all the files 
    files = {D(~[D.isdir]).name}; 

    %// Remove .DS_store files 
    files = files(~strcmpi(files, '.DS_store')); 

    %// For every subfolder, call this function recursively 
    for k = 1:numel(folders) 
     flattenFolder(fullfile(folder, folders{k}), destination); 
    end 

    %// If the source and destination are the same, don't worry about moving the files 
    if strcmp(folder, destination) 
     return 
    end 

    %// Move all of the files to the destination directory 
    for k = 1:numel(files) 

     destfile = fullfile(destination, files{k}); 

     %// Append '_duplicate' to the filename until the file doesn't exist 
     while exist(destfile, 'file') 
      [~, fname, ext] = fileparts(destfile); 
      destfile = fullfile(destination, sprintf('%s_duplicate%s', fname, ext)); 
     end 

     movefile(fullfile(folder, files{k}), destfile); 
    end 
end 

Dann mit Ihrem Beispiel Sie dies als nennen würde:

flattenFolder('Main_Folder') 

Hinweis

Wie andere hav Wie gesagt, MATLAB ist nicht das ideale Werkzeug für diese Aufgabe. Da Sie OS X verwenden, ist die Verwendung von bash über die Befehlszeile möglicherweise eine bessere Option.

find Main_Folder/ -mindepth 2 -type f -exec mv -i '{}' Main_Folder/ ';' 
+0

gut, danke, es ist eine wirklich gute Lösung und es funktioniert perfekt. Noch eine Sache: Haben Sie eine Idee, wie Sie dieses Steuerelement steuern können: Wenn Sie beim Verschieben jeder Datei im Main_Folder eine Datei mit demselben Namen finden, benennen Sie die Datei, die Sie verschieben, beispielsweise den Buchstaben 'w' am Ende ein von der Datei, die das System bewegt? Vielen Dank – David

+0

@David Ich habe es geändert, um '_duplicate' zu ​​einer Datei hinzuzufügen, die bereits im Ziel vorhanden ist. – Suever

+0

Ich habe versucht, den Code mit der Änderung, die Sie getan haben, aber ich bekomme den folgenden Fehler (ich habe in den Ordnern die versteckten Dateien .DS_Store): – David