WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Dateien im Ordner umbenennen

 

Luster19
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.12.2017, 01:52     Titel: Dateien im Ordner umbenennen
  Antworten mit Zitat      
Hallo,

in einem Ordner habe ich verschiedene .mat und .avi Dateien. Diese sehen beispielhaft wie folgt aus:

video_2017_12_03_01.avi
video_2017_11_20_02.avi

test_2017_12_03_xx.mat
test_2017_11_20_yy.mat

Nun möchte ich, dass die Videodateien auf die Namen der .mat-Dateien umbenannt werden. Zu jeder .mat-Datei gibt es eine passende .avi-Datei. Dies erkennt man am Datum in der Mitte der Namen. Die Video-Dateien sollen dann also wie folgt umbenannt werden:

video_2017_12_03_01.avi soll zu test_2017_12_03_xx.avi umbenannt werden
video_2017_11_20_02.avi soll zu test_2017_11_20_yy.mat umbenannt werden

Ich muss also erstmal suchen, ob das Datum von einer avi- und mat-Datei gleich ist. Wenn das der Fall ist, dann soll die Videodatei den Namen von der dazu passenden .mat-Datei bekommen, aber natürlich soll die Videodatei mit .avi enden und nicht mit .mat.

Bis jetzt habe ich folgendes geschrieben:
Code:
cd C:\Users\Ordnername;
a=dir('*.avi');
b=dir('*.mat');


Ich weiß, ist nicht viel. Bin ein Matlab-Anfänger. Nun dachte ich, dass ich erstmal mit einer doppelten for-Schleife alle Dateinamen durchgehe. Danach kann ich untersuchen, ob 10 aufeinanderfolgende chars von a und b gleich sind. Wenn das der Fall ist, soll dann der Name von der jeweiligen a-Datei mit movefile in die dazu passende b-Datei umbenannt werden. Das ist zumindest meine Idee, vielleicht gibt es da auch schlauere/einfachere Lösungen.

Ich weiß aber leider nicht, wie ich das mit den 10 aufeinanderfolgenden Chars hinbekommen soll. Kann mir da jemand bitte helfen bzw. einen Tipp geben? Ich bin natürlich auch für andere Vorschläge offen, vielleicht ist mein Ansatz ja falsch. Ich wäre euch wirklich sehr dankbar.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 03.12.2017, 11:41     Titel:
  Antworten mit Zitat      
Hallo,

eine Schleife über die .avis sollte reichen. Dann kannst du mit contains überprüfen, ob und in welchem Namen der .mat-Dateien das passende Datum vorkommt.
Erster Schritt ist natürlich das Extrahieren der Namen, z.B.
Code:
names = {a.name}


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Luster19
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.12.2017, 17:43     Titel:
  Antworten mit Zitat      
Danke erstmal für deine Hilfe, bin jetzt auf jeden Fall einen Schritt weiter. Ich hab den Code jetzt soweit angepasst:

Code:
cd C:\Users\Ordnername;
a=dir('*.avi');
b=dir('*.mat');

videonames = {a.name};
matnames = {b.name};
for i = 1:size(a)
TF = contains(videonames,matnames);
end


In TF sind dann 4 Nullen eingespeichert, da die Namen der Video- und mat-Dateien natürlich nicht komplett identisch sind. Ich will ja nur schauen, ob das Datum von den Dateien gleich ist und nicht die kompletten Namen vergleichen. Wie kriege ich es also hin, dass nur das Datum bzw. allgemein aufeinanderfolgende Zahlen/Chars verglichen werden?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 04.12.2017, 17:48     Titel:
  Antworten mit Zitat      
Hallo,

du musst jeweils den i-ten Videonamen nehmen und daraus die entsprechenden Zeichen, also etwa so
Code:
TF = contains(videonames{i}(7:16),matnames);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Luster19
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2017, 17:16     Titel:
  Antworten mit Zitat      
Hallo,

danke für deine Hilfe. Ich bin jetzt einen Schritt weiter, aber leider hänge ich wieder fest. Den Code habe ich wie folgt erweitert:

Code:

cd C:\Users\Ordnername;
a=dir('*.avi');
b=dir('*.mat');

videonames = {a.name};
new_videonames = {a.name};
matnames = {b.name};

for i = 1:size(videonames)
   
TF = contains(matnames,videonames{i}(7:16));

if any(TF>0)
   new_videonames{i}=matnames{i};
end
end


Das funktioniert nun in soweit, dass durch die Schleife untersucht wird, ob zum ersten Eintrag in videonames eine identische Abfolge von Zeichen in matnames existiert. Diese wird gefunden und in new_videonames wird auch der Name der Videodatei durch den Namen in der mat-Datei ersetzt. Aber das geschieht nur für den ersten Videonamen. Die Schleife scheint sich nicht automatisch zu erhöhen und sich den zweiten Videonamen anzuschauen.

Wenn ich das Programm ausführe, dann sieht es so aus:
TF = [1 | 0]
new_videonames = [test_2017_12_03_xx.mat | video_2017_11_20_02.avi]

Ich verstehe eben nicht, warum nur der Name vom ersten Eintrag verändert wird. Außerdem ändere ich so erstmal nur den Namen im Array, aber nicht im Ordner. Wie kriege ich es hin, dass der Name der Videodatei auch automatisch im Ordner verändert wird?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.12.2017, 17:32     Titel:
  Antworten mit Zitat      
Hallo,

das dürfte daran liegen, dass du size für den Endpunkt der for-Schleife verwendest. Ich würde length verwenden.

Außerdem ist nicht nur wichtig, ob der Name vorkommt, sondern auch wo. Ich würde also find(TF) verwenden.

Die Dateiendung solltest du auch noch anpassen. Das geht z.B. mit strrep.

Das Verschieben von Dateien kannst du dann mit movefile erledigen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Luster19
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2017, 23:06     Titel:
  Antworten mit Zitat      
Den Code habe ich jetzt wie folgt überarbeitet:

Code:
for i = 1:length(videonames)
   
TF = contains(matnames,videonames{i}(7:16));

if any(TF>0)
   new_videonames{i}=matnames{i};
   endung{i} = strrep(new_videonames{i},'.mat','.avi');
end

movefile(new_videonames{i},endung{i});
end
 


Leider bleiben dadurch die Videodateien so wie sie sind im Ordner und die mat-Dateien bekommen die Endung .avi und werden ebenfalls zu Videodateien.

Ich hab leider auch nicht ganz verstanden, was genau ich mit find anstellen soll. Ich hab damit rumgespielt und wenn ich z.B.
Code:
einsetze, dann bekommt k die Zahl 2. Also ich weiß dann eigentlich nur wie viele gleiche Namen gefunden wurden und nicht wo diese sich befinden.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.12.2017, 23:35     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Leider bleiben dadurch die Videodateien so wie sie sind im Ordner und die mat-Dateien bekommen die Endung .avi und werden ebenfalls zu Videodateien.

Bei deinem Aufruf kein Wunder. Das erste Argument von movefile muss der alte Name sein, also videonames{i} .

Zitat:
Also ich weiß dann eigentlich nur wie viele gleiche Namen gefunden wurden und nicht wo diese sich befinden.

Wie kommst du auf die Idee? Es ist genau umgekehrt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Luster19
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2017, 23:50     Titel:
  Antworten mit Zitat      
Zitat:

Bei deinem Aufruf kein Wunder. Das erste Argument von movefile muss der alte Name sein, also videonames{i} .


Sorry, dummer Fehler. Hab das nun geändert. Aber es funktioniert leider trotzdem nicht ganz. Also zwar haben jetzt die Videodateien die gleichen Namen wie die mat-Dateien, aber die Videodateien sind fehlerhaft und können nicht abgespielt werden. Die Videodateien haben nun dieselbe Größe wie die mat-Dateien. Ich hab das Gefühl, dass hier einfach nur die mat-Dateien kopiert wurden und die Endung .avi angehängt wurde. Es handelt sich nicht mehr um die ursprünglichen Videodateien.

Zitat:

Wie kommst du auf die Idee? Es ist genau umgekehrt.


Ich hab wie gesagt k=find(TF) im Code eingebracht und k ist dann nur ein Array mit der Anzahl der gefundenen passenden Namen. Deshalb habe ich nicht ganz verstanden, wie ich find in meinem Code integrieren und nutzen soll.

Edit: Nachdem ich Matlab neugestartet habe, sind die Videos doch nicht beschädigt und die Umbenennung funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.12.2017, 00:00     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
k=find(TF) im Code eingebracht und k ist dann nur ein Array mit der Anzahl der gefundenen passenden Namen

Sorry, aber das stimmt definitiv nicht. Es ist die Stelle, an der in einer Iteration der Name gefunden wurde. Und dieses k solltest du als Index für die Umbenennung verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Luster19
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 00:07     Titel:
  Antworten mit Zitat      
Ich bin dir sehr dankbar Harald, der Code funktioniert soweit und ich habe einiges dazu gelernt. Ich hab noch eine letzte Frage. Die Zeile
Code:
TF = contains(matnames,videonames{i}(7:16));
passt zwar zum aktuellen Ordner und den aktuellen Daten, aber es ist sehr wahrscheinlich, dass es noch andere Namen geben wird. Es wäre also mühsam für jeden Ordner immer zu schauen ab welchem Zeichen das Datum beginnt und das dann abzugreifen und zu vergleichen. Gibt es die Möglichkeit das automatisierter ablaufen zu lassen? Das Datum wird immer vorhanden sein, aber die Buchstaben und Zahlen davor und danach verändern sich in ihrer Anzahl.

Also statt jetzt wie im aktuellen Code zu überprüfen, ob die Zeichen von 7 bis 16 gleich sind, wäre es eleganter zu überprüfen, ob 10 aufeinanderfolgende Zeichen gleich sind. Dann ist es nämlich egal, was vor dem Datum für Zeichen sind und man spart sich die Zählerei für jeden einzelnen Ordner.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.12.2017, 11:02     Titel:
  Antworten mit Zitat      
Hallo,

falls vor dem Datum immer ein Unterstrich ist bzw. der Datumsteil durch Unterstriche getrennt ist, kannst du strfind verwenden, um die Positionen der Unterstriche zu finden und so die Position des Datumsteils bestimmen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Luster19
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 09.11.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.12.2017, 15:06     Titel:
  Antworten mit Zitat      
Danke, ich werde mir erstmal eine einheitliche Struktur überlegen und dann mache ich das mit strfind.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.