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

Bash Ergebnis einer Wildcard ausgeben bzw. Speichern

Frage Entwicklung Batch & Shell

Mitglied: t.unselt

t.unselt (Level 1) - Jetzt verbinden

02.06.2013 um 21:38 Uhr, 2161 Aufrufe, 18 Kommentare

Hallo ihr Lieben,

ich versuche verzweifelt das Ergebnis einer Wildcard bzw Platzhalter auszugeben.
Hier ein Beispiel was ich meine.
Ich hab in einem Dateinamen einen variablen String auf den ich prüfe.

Original Dateiname: Date1nam3MitS03E09VielM1st.kram

Das einzige was immer gleich ist, ist ....S??E??....

Sprich nach dem "S" kommen 2 Ziffern und nach dem "E" kommen 2 Ziffern. Die 4 Platzhalter in dem Fall die Fragezeichen enthalten dann bestimmte Ziffern, die ich in einer Variable oder .txt-Datei brauche. Gerne auch noch mit dem "S" und "E".
Wunschergebnis: S04E07

Ich hoffe ich habe mein Problem genau darstellen können und danke schonmal im Voraus für eure Hilfe!

Mit freundlichen Grüßen
Thorsten
Mitglied: certifiedit.net
02.06.2013 um 22:25 Uhr
Hallo Thorsten,

probier es mal per regular expressions. Dürfte dir helfen die Dinge zu vereinfachen.

Grüße
Bitte warten ..
Mitglied: t.unselt
02.06.2013 um 22:32 Uhr
Vielen Dank für deine schnelle Antwort.
Ich werde mich gleich ein wenig darüber schlau machen.
Parallel ist mir noch ein weiterer Ansatz eingefallen, der vielleicht helfen könnte.
Wenn ich vor dem S??E?? ein Trennzeichen setzen könnte, könnte ich in der for-schleife mit tokens und delims arbeiten und so den teilstring rausholen.

Gibt es vielleicht eine Möglichkeit mit findstr über "S..E.." Trennzeichen vor oder nach dem Match zu setzen? Oder eine Alternative.

Ich werde mich weiter informieren und bin um jede Hilfe Dankbar.
Bitte warten ..
Mitglied: certifiedit.net
02.06.2013 um 22:37 Uhr
Hallo,

was ist denn das exakte Ziel?
Bitte warten ..
Mitglied: hmarkus
02.06.2013, aktualisiert um 22:47 Uhr
Guten Abend,

certifiedit hat oben schon richtig gesagt, dass man es mit Regulären Ausdrücken macht. Man muss also ein Werkzeug nehmen, welches solche beherrscht. Ich hab sed genommen. Der gesuchte Code wird zwischen Klammern () die mit Backslash escaped werden müssen "eingefangen", die Variable \1 im Ersetzungsausdruck enthält den eingefangenen Text.

variable=$(find . | sed -n 's/.*\(S[0-9][0-9]E[0-9][0-9]\).*/\1/p')
dann kannst Du Dir mit
echo $variable
den Inhalt der Variablen ansehen.

find durchsucht allerdings im obigen Code auch alle Unterverzeichnisse.

Markus
Bitte warten ..
Mitglied: t.unselt
02.06.2013 um 22:45 Uhr
Hi,

Wie bereits oben beschrieben. Ich muss aus einem Dateinamen mit der einzigen Information das der String "S??E??" immer gleich und einmalig ist die beiden Zahlen raus holen. Beide Zahlen haben ein Case von [01-30].

Der Rest des ganzen Dateinamens ist unwichtig. Mir geht es darum im Endeffekt eine Variable mit dem Beispielwert "S03E08" zu haben.

Grüße
Bitte warten ..
Mitglied: certifiedit.net
02.06.2013 um 22:49 Uhr
Hallo,

@hmarkus: ich bin der Christian ;)

@t.unselt: Was soll denn das Endergebnis sein? Einfaches Dateiumbenennen? Dann mach dir das Leben nicht so schwer. Wie soll das ganze weiterverarbeitet werden, evtl lässt sich dafür eine sinnvollereLösung finden.

Grüße
Bitte warten ..
Mitglied: t.unselt
02.06.2013 um 22:55 Uhr
<code type=plain>variable=$(find . | sed -n 's/.*\(S[0-9][0-9]E[0-9][0-9]\).*/\1/p')

Hallo Markus. Das sieht sehr vielversprechend aus. Scheinbar habe ich es nicht deutlich gemacht, dass ich mich in einer cmd von Windows bewege.

Entschuldige. Gibt es dazu eine cmd-Analogie?
Bitte warten ..
Mitglied: t.unselt
02.06.2013 um 22:57 Uhr
@t.unselt: Was soll denn das Endergebnis sein? Einfaches Dateiumbenennen? Dann mach dir das Leben nicht so schwer. Wie soll das
ganze weiterverarbeitet werden, evtl lässt sich dafür eine sinnvollereLösung finden.

Im prinzip soll die Datei dann nur umbenannt werden.
Meines erachtens benötige ich vorher aber den jeweiligen String aus der Datei "S??E??"

Grüße
Bitte warten ..
Mitglied: certifiedit.net
02.06.2013 um 22:59 Uhr
Man könnte die Lösung schneller haben, wenn man sagt, was man will. Such mal nach dem Programm reNamer. Das macht das alles für dich.

Grüße
Bitte warten ..
Mitglied: hmarkus
02.06.2013 um 23:25 Uhr
Zitat von t.unselt:
Hallo Markus. Das sieht sehr vielversprechend aus. Scheinbar habe ich es nicht deutlich gemacht, dass ich mich in einer cmd von
Windows bewege.

Entschuldige. Gibt es dazu eine cmd-Analogie?
Also der Threadtitel sagt Bash. Ich hab also eine Lösung die unter Unix/Linux in der Shell funktioniert gepostet. Ausprobiert hab ich es allerdings in MobaXterm auf Windows. Wenn Du ein Script brauchst, welches mit Regulären Ausdrücken Dateien umbenennt, dann nimm das hier
01.
#!/usr/bin/perl 
02.
 
03.
use strict ; 
04.
use warnings ; 
05.
use feature 'say' ; 
06.
use File::Copy ; 
07.
  
08.
my ( $old, $new, $in, $op ) ; 
09.
$op = shift ; 
10.
foreach ( @ARGV ) { 
11.
    $old = $_ ; 
12.
    eval $op ; 
13.
    if ( $old ne $_ && -e $_ ) { 
14.
        say "Neuer Dateiname $_ bereits vorhanden. Überspringe $old!" ; 
15.
        next ; 
16.
17.
    move ( $old, $_ ) unless $old eq $_ ; 
18.
}
das ist ein Perlscript, Perl kannst Du auch auf Windows installieren. Ich benutze das Skript um mp3-Dateien umzubenennen. Bei mir heißt es rename.pl und würde so funktionieren
rename.pl 's/.*(S\d\dE\d\d).*/$1/' *.kram 
Ausgabe:
markus@samsung:~/datei$ touch Date1nam3MitS03E09VielM1st.kram 
markus@samsung:~/datei$ ls 
Date1nam3MitS03E09VielM1st.kram 
markus@samsung:~/datei$ rename.pl 's/.*(S\d\dE\d\d).*/$1/' *.kram  
markus@samsung:~/datei$ ls 
S03E09 
markus@samsung:~/datei$ 
Das geht auch unter Windows.

Markus
Bitte warten ..
Mitglied: hmarkus
02.06.2013 um 23:27 Uhr
Zitat von certifiedit.net:
Hallo,

@hmarkus: ich bin der Christian ;)
Sorry, ich hatte den Namen Thorsten gesehen und den Fehler zu spät bemerkt.

Markus
Bitte warten ..
Mitglied: t.unselt
02.06.2013 um 23:46 Uhr
Ich werde es versuchen so deutlich zu schreiben wie möglich.

Ich habe eine Ansammlung von Serien. Die .avi´s liegen meist in Ordnern, welche den Seriennamen, Staffel, Episode und Episodennamen in einer unschönen Form haben. Diese Ordner liegen in eine Überorder z.B Staffel01, Staffel02...
Dieser Ordner liegt wiederum in einem Ordner des Seriennamens, auf dem mein Script angewendet wird.

Die Hierarchie sieht so aus:
J.A.G. - Im Auftrag der Ehre\S03\JAG.S03E04.Die.Sicht.der.Dinge.German.FS.DVDRip.XviD-iNSPiRED\isd-jagdxvid-s03e04.avi

Das Script soll folgendes tun (Anhand dieses Beispiels):
1. Ab "J.A.G. - Im Auftrag der Ehre" alle Unterordner durchsuchen und die AVI´s in einen neuen ORdner kopieren (funktioniert)
2. Im neuen Ordner die jeweilige Staffel und Episode ausfindig machen und die Datei ordentlich Bennen (funktioniert nicht)
So Soll es dann aussehen J.A.G - S03E04

3. Im Besten fall dann noch den Episodennamen " Die SIcht der Dinge" hinten dran hängen. Das ist aber erstmal zweitrangig.

Da ich nicht alle Serien immer mit Serienname.StaffelEpisode.Episodennamen habe, kann ich nicht mit Trennzeichen arbeiten, sondern muss innerhalb des Strings suchen, was es gibt.


Mein bisheriger Code:

FOR /F "delims=#" %%i IN ('dir /ad /b /s /a "%serienpfad%"') DO (
@copy "%%i" %serienpfad%\neu\
echo %%i>%serienpfad%\neu\tmp.txt
findstr "S[0-9][0-9]E[0-9][0-9]" "%serienpfad%\neu\tmp.txt"

)


Grüße
Bitte warten ..
Mitglied: certifiedit.net
02.06.2013 um 23:50 Uhr
Nimm reNamer, das sollte am schnellsten gehen. Da packst du alle gleich formatierten avis rein und in 2-3 Durchgängen hast du hunderte Daten ordentlich umbenannt.
Bitte warten ..
Mitglied: t.unselt
02.06.2013 um 23:56 Uhr
Ich dachte mir schon, dass es darauf hinauslaufen wird.
Es wäre mit Sicherheit die schnellere Lösung. Doch mittlerweile hat mich der Ehrgeiz gepackt und ich will wissen, ob es die CMD wirklich nicht umsetzen kann.

Grüße
Bitte warten ..
Mitglied: hmarkus
02.06.2013 um 23:57 Uhr
Ich habe mir die Hilfe zu findstr mal angesehen. Das was Du brauchst, nämlich die gefundene Zeichenkette wieder verwenden, das kann findstr nicht. Außerdem ist Batch nicht leistungsfähig genug für so eine Aufgabe.

Entweder Du machst es wie certifiedit schreibt mit dem richtigen Tool, also reNamer (was ich nicht kenne, macht aber nix ). Oder Du bootest mal mit einer Linux-Live-CD und machst es so wie oben beschrieben.

Alternative: benutze eine richtige Programmiersprache unter Windows, z.B. VB.

Markus
Bitte warten ..
Mitglied: Endoro
03.06.2013 um 01:02 Uhr
Hallo,

Zitat von hmarkus:
Ich habe mir die Hilfe zu findstr mal angesehen. Das was Du brauchst,
nämlich die gefundene Zeichenkette wieder verwenden, das kann findstr nicht. Außerdem ist Batch nicht
leistungsfähig genug für so eine Aufgabe.

Die erste Aussage stimmt, die zweite nicht

Wiedemauchsei @Thorsten du solltest mehr live-Dateinamen zum Testen posten. Nicht zwingend erforderlich aber sehr nützlich wäre es, wenn du dir GNU sed für Windows installieren würdest.

Gruss!
Bitte warten ..
Mitglied: t.unselt
03.06.2013 um 01:31 Uhr
Hallo Endoro,

vielen Dank für deine späte Antwort. Mitlerweile bin ich das ganze mit powershell am umsetzen.
Ich wollte eigentlich auf zusatztools etc. verzichten. Desshalb ist der renamer auch nichts für mich. Mit dem Sed würde ich mit (find . | sed -n 's/.*\(S[0-9][0-9]E[0-9][0-9]\).*/\1/p') vielleicht an mein Ziel kommen. Aber evtl. finde ich noch einen anderen Weg über cmd eigene Mittel, wo ich ganz anders ansetzen muss.

Grüße.
Bitte warten ..
Mitglied: Endoro
03.06.2013, aktualisiert um 09:06 Uhr
Hallo Thorsten,

hier mal ein Vorschlag für sed + Batch:
01.
@echo off &setlocal 
02.
set "videopath=c:\videopath" 
03.
set "destination=c:\new videopath" 
04.
for /f "delims=" %%i in ('dir /s/a-d/b "%videopath%\*.avi"^| findstr /ri "S[0-9][0-9]E[0-9][0-9]"') do ( 
05.
	for /f "delims=" %%a in ("%%~dpi.") do set "fdir=%%~nxa" 
06.
	set "fname=%%~fi" 
07.
	for /f "delims=" %%a in ('echo(%%~ni^|sed "s/.*\(S[0-9][0-9]E[0-9][0-9]\).*/\1/i"') do set "nname=%%a" 
08.
	setlocal enabledelayedexpansion 
09.
	for /f "tokens=1-6delims=." %%a in ("!fdir!") do set "nname=%%a-!nname!-%%c %%d %%e %%f%%~xi" 
10.
	echo move "!fname!" "%destination%\!nname!"  
11.
	endlocal 
12.
)
Gruss!
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Debian
gelöst Bash - String zwischen zwei Kommata ausgeben (3)

Frage von plutowitsch zum Thema Debian ...

VB for Applications
gelöst VBA-Makro verschwindet nach Speichern (5)

Frage von lupi1989 zum Thema VB for Applications ...

Exchange Server
gelöst Exchange 2010 Activesync Problem bei IOS 10.1.1 und Wildcard SSL Zertifikat (2)

Frage von hasel123 zum Thema Exchange Server ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (10)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (8)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...