Reihe von Strings aus Dateinamen entfernen

J

Junchen

Neues Mitglied
Thread Starter
Dabei seit
22.07.2013
Beiträge
12
Reaktionspunkte
0
Hallo,

ich bin auf der Suche nach der besten Lösung, viele Strings aus den Dateinamen aller Dateien in einem Ordner, mit einer bestimmten Endung (.dat) zu entfernen.

Es sind etwa 120 unterschiedliche Strings (Tendenz steigend), die vorkommen könnten, weshalb mir das manuelle Einfügen entsprechender Aktionen in einem Automator-Workflow zu unpraktisch erscheint.

Ich stelle es mir in etwa so vor, dass die Strings in einer Liste oder in ein Array eingepflegt werden, das dann durchlaufen wird.

Mir ist dabei relativ egal, wie das geschieht: AppleScript, Automator, Perl, Python, Bash. Die Hauptsache ist, dass es auf dem Mac läuft und vollautomatisch durch das Aufrufen des Skriptes die Dateien umbenannt werden.

Entsprechende Apps, wie Renamer aus dem App Store erfordern auch eine unpraktische Einrichtung und eine Aktion vom Nutzer, deshalb habe ich sie erst einmal für ungeeignet befunden (Gegenvorschläge durchaus erwünscht).

Ich erwarte natürlich keine fertigen Skripte, aber Hinweise zur vernünftigsten Vorgehensweise würden mich wirklich freuen. Vielen Dank im Voraus.

Gruß
 
@Junchen: Zeig' doch einfach ein paar Beispiele der Strings, evtl. lassen die sich auch noch »regexen«.
 
Danke erst einmal für alle Antworten. Sed schaut schon einmal nach etwas aus, nach dem ich mich umgesehen habe. Ich werde es mir mal genauer anschauen. Kann man das auch in einer Schleife ablaufen lassen? In etwa so:

Code:
entfernen = .unix, -unix, .d3, -d3

for i in entfernen
    do sed 's/$i//g'
done
Ich weiß, dass dieser Code alles andere als richitg ist, aber ich denke man versteht, was ich möchte. Ich möchte nur wissen, ob man so vorgehen könnte.

@Olivetti: Beispielstrings könnten sein: ".unix", "-unix", ".d3", "-d3". Die Dateien kommen aus zwei unterschiedlichen Systemen, die zwar alle die gleichen Begriffe nutzen, jedoch setzt das eine System Punkte, das andere Bindestriche vor den Ausdruck.
 
PHP:
#!/bin/bash
#set -vx
shopt -s nullglob

ext=".dat"

for file in *"$ext"
do
 file_org="$file"
 file="${file%$ext}"
 while read pattern
 do
  file="${file//$pattern/}"
 done<<EOF
-unix
.unix
-d3
.d3
EOF
[[ "${#file}" -gt 0 ]] && echo "mv -v  $file_org $file$ext" || echo "Error: $file_org $file$ext"
done

(Code ist bash, PHP-CodeTag wegen Syntax-Highlighting, welches aber nicht richtig trifft :Pfeif:)
 
Leider der Acc vom Bruder noch eingeloggt gewesen... kann gelöscht werden
 
Zuletzt bearbeitet:
Vielen Dank, das sieht schon sehr nach dem aus, was ich suche. Ich gestehe jedoch ein, dass es mir schwer fällt, das zu verstehen, weshalb ich mir nicht sicher bin, ob ich es richitg angewendet habe. Bei mir hat es jedenfalls leider nicht funktioniert. Ich habe das Skript in das Verzeichnis gelegt, in dem sich die Dateien befinden und es ausgeführt. Es läuft ohne Fehlermeldungen durch, verändert aber die Dateinamen nicht. Muss ich den Pfad noch setzen o.ä.?
 
Es werden nur ".dat"-Dateien verändert (Zeile 5) und das script ist in erster Linie natürlich für Junchen. :D

Und ganz wichtig: In der vorletzten Zeile muss ein echo raus, erst dann ist es "scharf":

Code:
[[ "${#file}" -gt 0 ]] && mv -v "$file_org[COLOR=#ff0000]" "[/COLOR]$file$ext" || echo "Error: $file_org $file$ext"
 
Zuletzt bearbeitet:
Nein, ich habe nur nicht bedacht, dass am Rechner meines Bruders auch mein Bruder angemeldet ist und nicht ich, tut mir leid, entschuldigt die Verwirrung...

Ja, das Programm ändert nur *.dat-Dateien, allerdings in welchem Verzeichnis? Systemweit? .Dat-Dateien im gleichen Verzeichnis jedenfalls wurden nicht geändert: "-unix" wurde nicht entfernt.
 
Geändert werden Dateien in dem Verzeichnis, in dem das Script ausgeführt wird und beachte noch Post #9.
 
Geändert werden Dateien in dem Verzeichnis, in dem das Script ausgeführt wird und beachte noch Post #9.
Ok gut, dann verstehen wir uns auf jeden Fall schon einmal richtig, das ist nämlich genau das, was ich haben wollte. Allerdings funktioniert es bei mir leider nicht.

Ich habe (testweise) folgende Dateien in meinem Ordner: script.sh, systemimport-unix.dat, systemimport.unix.dat

Ich führe dein Skript (mit #9 modifiziert) aus:

Code:
[COLOR=#008400][FONT=Menlo]#!/bin/bash[/FONT][/COLOR][COLOR=#008400][FONT=Menlo]#set -vx[/FONT][/COLOR]
[FONT=Menlo]shopt -s nullglob[/FONT]
[FONT=Menlo]
[/FONT]
[COLOR=#D12F1B][FONT=Menlo][COLOR=#000000]ext=[/COLOR]".dat"[/FONT][/COLOR]
[FONT=Menlo]
[/FONT]
[FONT=Menlo][COLOR=#bb2ca2]for[/COLOR] file [COLOR=#bb2ca2]in[/COLOR] *[COLOR=#d12f1b]"$ext"[/COLOR][/FONT]
[COLOR=#BB2CA2][FONT=Menlo]do[/FONT][/COLOR]
[FONT=Menlo]file_org=[COLOR=#d12f1b]"$file"[/COLOR][/FONT]
[COLOR=#D12F1B][FONT=Menlo][COLOR=#000000]file=[/COLOR]"${file%$ext}"[/FONT][/COLOR]
[FONT=Menlo][COLOR=#bb2ca2]while[/COLOR] [COLOR=#bb2ca2]read[/COLOR] pattern[/FONT]
[COLOR=#BB2CA2][FONT=Menlo]do[/FONT][/COLOR]
[COLOR=#D12F1B][FONT=Menlo][COLOR=#000000]file=[/COLOR]"${file//$pattern/}"[/FONT][/COLOR]
[FONT=Menlo][COLOR=#bb2ca2]done[/COLOR]<<EOF[/FONT]
[FONT=Menlo]-unix[/FONT]
[FONT=Menlo].unix[/FONT]
[FONT=Menlo]-d3[/FONT]
[FONT=Menlo].d3[/FONT]
[FONT=Menlo]EOF[/FONT]
[COLOR=#D12F1B][FONT=Menlo][COLOR=#000000][[ [/COLOR]"${#file}"[COLOR=#000000] -gt [/COLOR][COLOR=#272ad8]0[/COLOR][COLOR=#000000] ]] && mv -v [/COLOR]"$file_org $file$ext"[COLOR=#000000] || echo [/COLOR]"Error: $file_org $file$ext"[/FONT][/COLOR]
[COLOR=#BB2CA2][FONT=Menlo]done[/FONT][/COLOR]


Der Pfad enthält keine Leerzeichen, es gibt keine Fehlermeldungen und script.sh hat durch chmod 777 bekommen. Wo liegt mein Fehler?

===================================

Edit: Ok, der Fehler lag darin, dass das Skript offenbar für den Ordner aufgerufen wird, der das Skript aufruft, nicht zwingend den Ordner, in dem das Skript liegt. Jetzt bin ich schon einmal ein gutes Stück weiter. Ich erhalte nun jedoch folgende Fehlermeldung:

Code:
usage: mv [-f | -i | -n] [-v] source target       mv [-f | -i | -n] [-v] source ... directory
Error: systemimport-unix.dat systemimport.dat
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
Error: systemimport.unix.dat systemimport.dat

Das zeigt zum einen, dass das Entfernen des Strings zu klappen scheint, jedoch das Umbenennen falsche Daten zu bekommen scheint. Setze ich das "echo" in der vorletzten Zeile erneut, erhalte ich den (soweit ich weiß) korrekten Aufruf
Code:
mv -v systemimport-unix.dat systemimport.dat
mv -v systemimport.unix.dat systemimport.dat
Als Ausgabe. Ich muss gestehen, dass ich damit dann allerdings auch schon am Ende meines Lateins bin.
 
Zuletzt bearbeitet:
Ich habe Post #9 nochmal editiert (mein Fehler, es fehlten " " /rot markiert).

Ändere auch deine 1. Zeile in:
Code:
#!/bin/bash
#set -vx

Und beachte, dass aus den Beiden systemimport-unix.dat und systemimport.unix.dat schliesslich nur eine systemimport.dat wird.

Edit: Ok, der Fehler lag darin, dass das Skript offenbar für den Ordner aufgerufen wird, der das Skript aufruft, nicht zwingend den Ordner, in dem das Skript liegt.

Das script läuft da, wo du mit dem Terminal stehst, weil man normalerweise solche Dingsis in ein Verzeichnis des Suchpfads legt.
 
Ok, nun klappt es vollständig. VIELEN HERZLICHEN DANK!
Die erste Zeile scheint nur beim Kopieren verrutscht zu sein.

Für alle, die es evtl. später mal brauchen und über Google drauf stoßen, hier noch einmal das komplette, lauffähige Skript (rotes, fettgedrucktes "echo" entfernen, um es scharf zu stellen):

Code:
[COLOR=#008400][FONT=Menlo]#!/bin/bash
[/FONT][/COLOR][COLOR=#008400][FONT=Menlo]#set -vx[/FONT][/COLOR]
[FONT=Menlo]shopt -s nullglob[/FONT]

[COLOR=#D12F1B][FONT=Menlo][COLOR=#000000]ext=[/COLOR]".dat"[/FONT][/COLOR]

[FONT=Menlo][COLOR=#bb2ca2]for[/COLOR] file [COLOR=#bb2ca2]in[/COLOR] *[COLOR=#d12f1b]"$ext"[/COLOR][/FONT]
[COLOR=#BB2CA2][FONT=Menlo]do[/FONT][/COLOR]
[FONT=Menlo]file_org=[COLOR=#d12f1b]"$file"[/COLOR][/FONT]
[COLOR=#D12F1B][FONT=Menlo][COLOR=#000000]file=[/COLOR]"${file%$ext}"[/FONT][/COLOR]
[FONT=Menlo][COLOR=#bb2ca2]while[/COLOR] [COLOR=#bb2ca2]read[/COLOR] pattern[/FONT]
[COLOR=#BB2CA2][FONT=Menlo]do[/FONT][/COLOR]
[COLOR=#D12F1B][FONT=Menlo][COLOR=#000000]file=[/COLOR]"${file//$pattern/}"[/FONT][/COLOR]
[FONT=Menlo][COLOR=#bb2ca2]done[/COLOR]<<EOF[/FONT]
[FONT=Menlo]-unix[/FONT]
[FONT=Menlo].unix[/FONT]
[FONT=Menlo]-d3[/FONT]
[FONT=Menlo].d3[/FONT]
[FONT=Menlo]EOF[/FONT]
[COLOR=#D12F1B][FONT=Menlo][COLOR=#000000][[ [/COLOR]"${#file}"[COLOR=#000000] -gt [/COLOR][COLOR=#272ad8]0[/COLOR][COLOR=#000000] ]] && [/COLOR][/FONT][/COLOR][COLOR=#ff0000][FONT=Menlo][B]echo[/B][/FONT][/COLOR][COLOR=#D12F1B][FONT=Menlo][COLOR=#000000] mv -nv [/COLOR]"$file_org" "$file$ext"[COLOR=#000000] || echo [/COLOR]"Error: $file_org $file$ext"[/FONT][/COLOR]
[COLOR=#BB2CA2][FONT=Menlo]done[/FONT][/COLOR]

Und beachte, dass aus den Beiden systemimport-unix.dat und systemimport.unix.dat schliesslich nur eine systemimport.dat wird.

Ich werde demzufolge den Parameter -n zu mv hinzufügen, für so einen Fall. Im Normalfall heißen die Dateien jedoch alle unterschiedlich. Danke aber für den Hinweis.
 
Ich habe das bewusst mit eingebautem "echo mv -v ..." gepostet.

Edit: Mach das "mv -nv ..." doch bitte gleich rein, dann wird nichts überschrieben.

Edit2: Passt.
 
Zurück
Oben Unten