Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Teil des Datienames Umformen

Frage Entwicklung Batch & Shell

Mitglied: batchnewbie

batchnewbie (Level 1) - Jetzt verbinden

12.07.2014, aktualisiert 13.07.2014, 1138 Aufrufe, 11 Kommentare

Hallo allerseits,
Meine batch Kenntnisse sind nicht besonders, versuche jedoch alles allein zu machen und mich so weiter zu entwickeln.

Ich möchte Dateien in einem rutsch umbenennen, die in das Suchmuster passen,
jedoch nur ein Teil des Dateinames soll verändert werden.
Nur das Datum soll umgeformt werden, anstatt _ soll ein . rein.

ich_bin_12_07_2014_eine_datei.txt zu ich_bin_12.07.2014_eine_datei.txt
eine_12_07_2014_weitere_datei.txt zu eine_12.07.2014_weitere_datei.txt
usw. usf.

Bis jetzt habe ich das Umbenennen so gemacht (sehe Code), das ersetzt alle definierte Zeichen.
Wie kann ich es nur auf das Datum eingrenzt, bzw. nur auf Zahlen?

Mein Code
01.
@echo off &setlocal 
02.
 
03.
echo.>ich_bin_12_07_2014_eine_datei.txt 
04.
:: zu ich_bin_12.07.2014_eine_datei.txt 
05.
echo.>eine_12_07_2014_weitere_datei.txt 
06.
:: zu eine_12.07.2014_weitere_datei.txt 
07.
 
08.
for /f "delims=" %%i in ('dir /b /a-d *.txt^| findstr /rbc:".*[0-9][0-9]_[0-9][0-9]_[0-9][0-9][0-9][0-9].*"') do ( 
09.
	set "datei=%%~i" 
10.
	setlocal enabledelayedexpansion 
11.
	echo !datei! 
12.
	set "neudatei=!datei:_=.!" 
13.
	echo ren "!datei!" -^> "!neudatei!" 
14.
	echo. 
15.
	ren "!datei!" "!neudatei!" 
16.
	endlocal 
17.
)
Ich könnte das so machen:
set "neudatei=!datei:_01=.01!"
set "neudatei=!datei:_02=.02!"
usw. usf.
aber dann werden nicht alle Zahlen ersetzt und eine weitere Schleife wäre wohl nötig?
Eine universale Lösung wäre mir da lieber.

Da wird es doch eine einfachere Vorgehensweise geben??
Mitglied: rubberman
12.07.2014 um 16:46 Uhr
Hallo batchnewbie, willkommen im Forum.

Etwas mehr Input bitte. Du hast ja sicher nur Beispielnamen gepostet. Wie sieht das in der Realität aus? Ist die Anzahl Unterstriche vor dem Datum immer konstant? Oder ist die Länge des Dateinamens vor dem Datum immer konstant?

Grüße
rubberman
Bitte warten ..
Mitglied: colinardo
12.07.2014, aktualisiert um 17:55 Uhr
Moin,
falls du dich mal mit Powershell versuchen willst
01.
dir 'C:\Ordner\*.txt' | ?{$_.Basename -match '\d{1,2}_\d{1,2}_\d{4}'} | rename-item -NewName {$_.Name -replace '(\d{1,2})_(\d{1,2})_(\d{4})','$1.$2.$3'}
Grüße Uwe
Bitte warten ..
Mitglied: batchnewbie
12.07.2014 um 17:48 Uhr
@rubberman
Also, es sind jpg Bilder und die Dateinamen sind leider unterschiedlich lang vorn und hinter dem Datum, sonst hätte ich es schon per Tokens gelöst und vermutlich wird es auch nicht anders gehen, je nach der Vorn-Zeichenlänge werde ich es wohl dann zwei, drei Schleifen sein und dem dazugehörten Toknes.

@colinardo
Danke für den Powershell Code, bis jetzt habe ich mich noch nicht wirklich mit Powershell beschäftigt, die Kenntnisse sind da noch schlechter als mit Batch.
Bitte warten ..
Mitglied: rubberman
12.07.2014 um 18:43 Uhr
Hallo batchnewbie,

es gibt standardmäßig keinen Batchbefehl, der eine Ersetzung per "Regulärem Ausdruck" vornehmen kann (so wie es colinardo mit der PS vorgeturnt hat). Also wird's schwierig und du musst Alternativen finden. Ist ausgeschlossen, dass vor dem Datum bereits irgendwelche Zahlen im Dateinamen vorkommen?

BTW: Es gibt hervorragende Programme, die genau für das Umbenennen von Fotos entwickelt wurden.

Grüße
rubberman
Bitte warten ..
Mitglied: batchnewbie
12.07.2014 um 20:13 Uhr
Ja die Nummerierung ist Vorn 001_, 002_ usw. usf. hab ich ganz vergessen, da ich mich zu sehr auf das Datum konzentriert hatte.

Ja es geht viele Programme die das wohl mit Leichtigkeit schaffen, für mich ist das nur etwas Übung
Bitte warten ..
Mitglied: rubberman
LÖSUNG 12.07.2014, aktualisiert 13.07.2014
Na gut. Ich kitzle ja auch ganz gerne das Letzte aus Batch raus...

Teste
01.
@echo off &setlocal 
02.
for /f "delims=" %%i in ('dir /b /a-d *.txt ^| findstr /rc:".*[0-3][0-9]_[01][0-9]_20[0-9][0-9].*"') do ( 
03.
  set "fOld=%%~i" 
04.
  set "fNew=%%~i" 
05.
  setlocal EnableDelayedExpansion 
06.
  set "length1=0" 
07.
  REM alle Zahlen durch / ersetzen 
08.
  for %%j in (1 2 3 4 5 6 7 8 9 0) do set "fNew=!fNew:%%j=/!" 
09.
  REM Dateiname an der Zeichenfolge //_//_//// splitten 
10.
  for /f "delims=?" %%j in ("!fNew://_//_////=?!") do set "fNew=X%%j" 
11.
  REM Länge des 1. Teilstrings berechen 
12.
  REM   http://www.dostips.com/DtCodeCmdLib.php#Function.strLen 
13.
  for /l %%j in (12 -1 0) do ( 
14.
    set /a "length1 |= 1 << %%j" 
15.
    for %%k in (!length1!) do if "!fNew:~%%k,1!"=="" set /a "length1 &= ~1 << %%j" 
16.
17.
  REM Teilstring mit dem Datum extrahieren 
18.
  for %%j in (!length1!) do set "fNew=!fOld:~%%j,10!" 
19.
  REM in diesem Teilstring die Unterstriche durch Punkte ersetzen 
20.
  set "fNew=!fNew:_=.!" 
21.
  REM Länge bis zum ersten Zeichen nach dem Datum 
22.
  set /a "length2 = length1 + 10" 
23.
  REM Dateiname neu zusammensetzen 
24.
  for /f "tokens=1,2" %%j in ("!length1! !length2!") do set "fNew=!fOld:~,%%j!!fNew!!fOld:~%%k!" 
25.
  REM das ECHO und ggf. PAUSE entfernen, wenn du sicher bist dass die Ersetzung vernünftig funktioniert 
26.
  ECHO ren "!fOld!" "!fNew!" 
27.
  endlocal 
28.
29.
PAUSE
Ich hoffe die Kommentare helfen um zu verstehen. Die Zeichen / und ? verwende ich übrigens, weil sie nicht in einem Dateiname vorkommen können.

Grüße
rubberman
Bitte warten ..
Mitglied: Endoro
13.07.2014 um 07:13 Uhr
Hey rubberman,
Es müsste auch ohne die Ersetzungen gehen. Kanns leider grad nicht testen.
Gruss, Endoro
Bitte warten ..
Mitglied: batchnewbie
13.07.2014, aktualisiert um 10:59 Uhr
Hi,
da fällt mir außer eine große WOW nichts ein, vielen Danke, funktioniert wie es soll.

Ich habe selber noch versuche per:
01.
set "datei=!datei:01_=01.!" 
02.
set "datei=!datei:02_=02.!" 
03.
set "datei=!datei:_14_=_14.!" 
04.
:: usw. usf. 
05.
ren "%%i" "!datei!"
jedoch funktioniert das bei mir nicht wirtlich, da die Nummerierung Vorn auch umbenannt wird.
Bitte warten ..
Mitglied: rubberman
13.07.2014 um 12:09 Uhr
Hallo Endoro,

das erste was mir eingefallen ist, war von vorn tokenweise abzuschneiden und jedes mal mit findstr /b zu prüfen, ob das Datum vorn gelandet ist. Dann rufst du aber zig mal findstr als externes Tool auf, was am Ende eine Ewigkeit dauert und (wer weiß wie die Dateinamen tatsächlich aussehen) mehrfache konsekutive Unterstriche bekommst du dann auch nicht mehr vernünftig gehandhabt.
So ist wenigstens alles was nötig ist CMD-intern. Für die Ersetzung habe ich keine Alternative gefunden. Aber wenn dir noch 'ne andere Methode einfällt, kannst ja noch mal schreiben.

Grüße
rubberman
Bitte warten ..
Mitglied: Endoro
17.07.2014 um 21:16 Uhr
Hallo rubberman, ich war mit meinen Gedanken in der bash-Welt und du hast recht
Gruss, Endoro.
Bitte warten ..
Mitglied: rubberman
17.07.2014 um 23:37 Uhr
Ah, OK. Ich dachte ich könnte wieder was dazu lernen

Grüße
rubberman
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Verschlüsselung & Zertifikate
Kryptorätsel Teil 1: Die Geheimschrift für Liebende (1)

Link von netzwerker-92 zum Thema Verschlüsselung & Zertifikate ...

Batch & Shell
gelöst 2 Csv -Dateien zum Teil zusammenfügen (6)

Frage von Piotrney zum Thema Batch & Shell ...

C und C++
Dateien in Ordner kopieren anhand vom Teil eines Dateinamen (22)

Frage von onlyforu8373 zum Thema C und C ...

Batch & Shell
gelöst Dateien bezugnehmend auf Teil des Namens verschieben (8)

Frage von pbelcl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...