tony88
Anmeldungsdatum: 28. März 2009
Beiträge: 101
Wohnort: 127.0.0.1
|
In einer Textdatei steht: neuerDateiname alterDateiname Die Namen bestehen nur aus Buchstaben und ein paar Zahlen, getrennt von einem Leerzeichen. Die Dateinamen haben keine Sonderzeichen. Da es schon ein paar sehr viele sind ... mit welchen befehlen kann das automatisiert umbenannt werden?
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 9719
Wohnort: Münster
|
tony88 schrieb: […] Die Dateinamen haben keine Sonderzeichen.
Sofern das stimmt …
[…] mit welchen befehlen kann das automatisiert umbenannt werden?
Umbenennen kann man mit dem Befehl mv. Den musst Du in eine Schleife stecken, welche Deine Textdatei zeilenweise einliest. Wie hier erklärt: Shell/Bash-Skripting-Guide für Anfänger
|
tony88
(Themenstarter)
Anmeldungsdatum: 28. März 2009
Beiträge: 101
Wohnort: 127.0.0.1
|
die einzelnen befehle funktionieren, aber das verketten dieser klappt einfach nicht...: alles nach dem leerzeichen anzeigen | sed 's/.* //' - zweites feld anzeigen cut -d' ' -f2 - erstes feld | awk '{print $1}' - zweites feld
| awk '{print $2}' - while read line; do echo $line done < datei.txt und while read line; do mv $(awk '{print $1}') $(awk '{print $2}') done < datei.txt funktionieren noch nicht richtig miteinander....
|
juribel
Anmeldungsdatum: 20. April 2014
Beiträge: 1250
|
Wenn du schon so eine Datei hast, dann mach doch ein Shellskript daraus (bzw. aus einer Kopie). Schreibe (z. B. mit sed) vor jede Zeile einen "mv"-Befehl. Dann kannst du das Skript noch einmal kontrollieren, und danach rufst du es auf. Solch ein Vorgehen ist meiner Meinung nach erheblich simpler und weniger riskant. "mv" hat auch eine "verbose"-Option -v, mit der jede Aktion nochmal am Terminal protokolliert wird.
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 9719
Wohnort: Münster
|
tony88 schrieb: die einzelnen befehle funktionieren, aber das verketten dieser klappt einfach nicht […]
Du denkst zu kompliziert. Du benötigst doch nur:
while read alt neu rest
do echo mv $alt $neu
done <datei.txt Wenn das Ergebnis Deinen Vorstellungen entspricht, entferne das Wort echo .
|
juribel
Anmeldungsdatum: 20. April 2014
Beiträge: 1250
|
Cool! Ist es tatsächlich so, dass "read" eine eingelesene Zeile von selber wortweise in Variablen schreibt? In der manpage von read hab ich nichts dazu gefunden.
|
tony88
(Themenstarter)
Anmeldungsdatum: 28. März 2009
Beiträge: 101
Wohnort: 127.0.0.1
|
Da wurde wirklich zu kompliziert gedenkt while read alt neu rest
do mv $neu $alt
done <datei.txt bringt das Ergebnis, vielen Dank!
|
wxpte
Anmeldungsdatum: 20. Januar 2007
Beiträge: 1388
|
@kB: Dass das auch mit mehreren Variablen geht, wusste ich bisher auch noch nicht (ich hätte das wahrscheinlich wieder über meinen heißgeliebten Array gelöst. 😄) Aber eine Frage hätte ich: wozu dient die eingelesene Variable rest ? Im nachfolgenden Befehl taucht die ja nicht auf.
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 9719
Wohnort: Münster
|
wxpte schrieb: […] wozu dient die eingelesene Variable rest ?
Eine reine Vorsichtsmaßnahme, die man auch weglassen könnte. Nach Aufgabenstellung wäre $rest immer leer. Wenn jedoch die Spielregeln verletzt werden und es doch Leerzeichen oder Tabulatoren in den Namen gibt, fängt die zusätzliche Variable das auf. Die pure Existenz der dritten Variable garantiert also, dass die beiden ersten Variablen garantiert kein Leerzeichen oder Tabulator enthalten, selbst wenn die Eingabezeile fehlerhaft sein sollte. Wegen dieser Garantie kann man auf die Quotierung von $alt und $neu verzichten, die man sonst vorsichtshalber anwenden würde.
|
wxpte
Anmeldungsdatum: 20. Januar 2007
Beiträge: 1388
|
Ja, das ist eine sinnvolle Möglichkeit, Fehler abzufangen. Danke für die Info. 👍
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13209
|
juribel schrieb: Cool! Ist es tatsächlich so, dass "read" eine eingelesene Zeile von selber wortweise in Variablen schreibt? In der manpage von read hab ich nichts dazu gefunden.
| $ type read
read is a shell builtin
$ echo $SHELL
/bin/bash
$ man $SHELL
|
|
juribel
Anmeldungsdatum: 20. April 2014
Beiträge: 1250
|
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17621
Wohnort: Berlin
|
rklm schrieb: juribel schrieb: Cool! Ist es tatsächlich so, dass "read" eine eingelesene Zeile von selber wortweise in Variablen schreibt? In der manpage von read hab ich nichts dazu gefunden.
| $ type read
read is a shell builtin
$ echo $SHELL
/bin/bash
$ man $SHELL
|
Da es ein Shell-builtin ist, kann man help read aufrufen, und muss nicht in der Bash zu read umständlich herumblättern/suchen, gerade read kommt sicher xmal als Prosawort vor.
|
wxpte
Anmeldungsdatum: 20. Januar 2007
Beiträge: 1388
|
user_unknown schrieb: Da es ein Shell-builtin ist, kann man help read aufrufen, und muss nicht in der Bash zu read umständlich herumblättern/suchen, gerade read kommt sicher xmal als Prosawort vor.
Das ist ja auch ein guter Hinweis. Da ich das bisher auch nicht wusste, ... ... und muss nicht in der Bash zu read umständlich herumblättern/suchen, gerade read kommt sicher xmal als Prosawort vor.
weiß ich inzwischen aber immerhin, dass, wenn man es im manual zu bash finden will, 3039 Zeilen nach unten springen muss. 🤣 | ________
10:39 ~/Werkstatt$ man bash | grep -Fn 'read ['
3040: read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
________
10:39 ~/Werkstatt$
|
|
kB
Supporter, Wikiteam
Anmeldungsdatum: 4. Oktober 2007
Beiträge: 9719
Wohnort: Münster
|
wxpte schrieb: […] auch ein guter Hinweis. Da ich das bisher auch nicht wusste, ...
… solltest Du fleißiger im guten UbuntuUsers-de-Wiki lesen, beispielsweise: Bash/Hilfe
|