staging.inyokaproject.org

for Schleife und Daten aus txt-Verarbeiten

Status: Gelöst | Ubuntu-Version: Kubuntu 16.04 (Xenial Xerus)
Antworten |

moonwalker3

Anmeldungsdatum:
30. Juni 2008

Beiträge: 802

Ich habe eine txt-Datei mit zwei Spalten pro Zeile, mit Semikolon abgetrennt:

aa aa;bb bb
cc cc;dd dd
ee ee;ff ff

Die txt-Datei möchte ich nutzen, um mit einer for-Schleife die aktuellen Dateinamen (linke Spalte) mit neuen Dateinamen (rechte Spalte) umzubenennen. Mit diesem Befehl klappt es leider nicht:

IFS=";";cat liste.txt|while read -r left right tail; do mv "$left" "$right" ;done

Ich bekomme die Fehlermeldung:

mv: Aufruf von stat für 'aa aa' nicht möglich: Datei oder Verzeichnis nicht gefunden

Dabei existieren die Dateinamen aber doch. Was kann man da machen?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Schlägt es nur für "aa aa" fehl oder auch für die anderen Dateien?

Das eigentlich äquivalente Komamndo:

1
while read s ; do mv "${s/;*/}" "${s/*;/}"; done < liste.txt

funktioniert für mich, wenn ich "aa aa" und "cc cc" bereitstelle, aber nicht "ee ee", bis auf "ee ee":

1
mv: Aufruf von stat für »ee ee“ nicht möglich: Datei oder Verzeichnis nicht gefunden

Bist Du im richtigen Verzeichnis? Haben die Dateinamen vielleicht trailing whitespace im Namen?

moonwalker3

(Themenstarter)

Anmeldungsdatum:
30. Juni 2008

Beiträge: 802

user_unknown schrieb:

Bist Du im richtigen Verzeichnis? Haben die Dateinamen vielleicht trailing whitespace im Namen?

ja, ich bin im richtigen Verzeichnis. Was sind trailing whitespaces?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Leerzeichen am Schwanz des Dateinamens.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Bei mir funktioniert auch Dein Kommando. Deine Shell ist auch die Bash? Ein echo vor das mv setzen zeigt was?

1
IFS=";";cat liste.txt|while read -r left right tail; do echo mv "$left" "$right" ;done

Nicht, dass ich mir wirklich was davon verspreche. Aber vielleicht hiervon:

1
ls -l *" "* 

moonwalker3

(Themenstarter)

Anmeldungsdatum:
30. Juni 2008

Beiträge: 802

Also, die Dateinamen enthalten Leerzeichen. Deswegen wollte ich Anführungszeichen um die Dateinamen setzen. Dein erstes Kommando zeigt den mv-Befehl ohne Anführungszeichen.

Alternativ könnte ich in der txt den mv-Befehl basteln, also

mv -n "aa aa" "bb bb"

Vielleicht ist dieser Weg einfacher. Da bin ich aber auch überfragt.

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

moonwalker3 schrieb:

Also, die Dateinamen enthalten Leerzeichen. Deswegen wollte ich Anführungszeichen um die Dateinamen setzen. Dein erstes Kommando zeigt den mv-Befehl ohne Anführungszeichen.

Die werden ja schon von echo ausgewertet, um die anzuzeigen muesstest du da machen, ist aber nur Kosmetik:

1
IFS=";";cat liste.txt|while read -r left right tail; do echo mv "\"$left\"" "\"$right\"" ;done

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

moonwalker3 schrieb:

Also, die Dateinamen enthalten Leerzeichen. Deswegen wollte ich Anführungszeichen um die Dateinamen setzen. Dein erstes Kommando zeigt den mv-Befehl ohne Anführungszeichen.

Alternativ könnte ich in der txt den mv-Befehl basteln, also

mv -n "aa aa" "bb bb"

Vielleicht ist dieser Weg einfacher. Da bin ich aber auch überfragt.

Das echo die nicht anzeigt ist nicht das Problem. Wenn Du das erzwingst, und dann echo weglässt, dann sucht der mv-Befehl nach Dateien mit Anführungsstrichen im Namen. Letztlich von einem anderen Menschentypus als ich es bin zu verstehen - ich kann das komplexe Zusammenspiel da immer nur ausprobieren und eine Ebene weit verstehen.

Wer seine Defekte kennt, der eliminiert, wie ich, Leerzeichen in Dateinamen, weil sie nur Ärger machen. Ich kann das nur empfehlen.

Aber was sagt der ls-Befehl?

moonwalker3

(Themenstarter)

Anmeldungsdatum:
30. Juni 2008

Beiträge: 802

Problem gelöst! Dieser Code klappt:

cat bewegen.txt|while read -r left right tail; do mv "$left" "$right" ;done

Das Problem war, dass ich die txt-Datei vorher zwei Verzeichnisebenen höher hatte, also

cat ../../bewegen.txt|while read -r left right tail; do mv "$left" "$right" ;done

hat irgendwie nicht funktioniert. Egal.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

moonwalker3 schrieb:

Problem gelöst! Dieser Code klappt:

... und gewinnt einen "Useless Use of cat Award"! 😬

cat bewegen.txt|while read -r left right tail; do mv "$left" "$right" ;done

Das kannst Du einfacher haben:

1
while read -r left right tail; do mv "$left" "$right"; done <bewegen.txt

moonwalker3

(Themenstarter)

Anmeldungsdatum:
30. Juni 2008

Beiträge: 802

rklm schrieb:

moonwalker3 schrieb:

Problem gelöst! Dieser Code klappt:

... und gewinnt einen "Useless Use of cat Award"! 😬

Was für ein Schwachsinn!

Antworten |