Bash Ergebnis einer Wildcard ausgeben bzw. Speichern
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 207357
Url: https://administrator.de/forum/bash-ergebnis-einer-wildcard-ausgeben-bzw-speichern-207357.html
Ausgedruckt am: 15.05.2025 um 14:05 Uhr
18 Kommentare
Neuester Kommentar

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.
dann kannst Du Dir mit den Inhalt der Variablen ansehen.
find durchsucht allerdings im obigen Code auch alle Unterverzeichnisse.
Markus
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')
echo $variable
find durchsucht allerdings im obigen Code auch alle Unterverzeichnisse.
Markus
Hallo,
@64748: 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
@64748: 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

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 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?
#!/usr/bin/perl
use strict ;
use warnings ;
use feature 'say' ;
use File::Copy ;
my ( $old, $new, $in, $op ) ;
$op = shift ;
foreach ( @ARGV ) {
$old = $_ ;
eval $op ;
if ( $old ne $_ && -e $_ ) {
say "Neuer Dateiname $_ bereits vorhanden. Überspringe $old!" ;
next ;
}
move ( $old, $_ ) unless $old eq $_ ;
}
rename.pl 's/.*(S\d\dE\d\d).*/$1/' *.kram
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$
Markus

Sorry, ich hatte den Namen Thorsten gesehen und den Fehler zu spät bemerkt.
Markus
Markus

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
Entweder Du machst es wie certifiedit schreibt mit dem richtigen Tool, also reNamer (was ich nicht kenne, macht aber nix
Alternative: benutze eine richtige Programmiersprache unter Windows, z.B. VB.
Markus
Hallo,
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!
Zitat von @64748:
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.
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!
Hallo Thorsten,
hier mal ein Vorschlag für sed + Batch:
Gruss!
hier mal ein Vorschlag für sed + Batch:
@echo off &setlocal
set "videopath=c:\videopath"
set "destination=c:\new videopath"
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 (
for /f "delims=" %%a in ("%%~dpi.") do set "fdir=%%~nxa"
set "fname=%%~fi"
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"
setlocal enabledelayedexpansion
for /f "tokens=1-6delims=." %%a in ("!fdir!") do set "nname=%%a-!nname!-%%c %%d %%e %%f%%~xi"
echo move "!fname!" "%destination%\!nname!"
endlocal
)
Gruss!