bash Fehler beim Umbenennen von Dateien mit Leerzeichen - mv target ist kein Verzeichnis

9

Ich versuche, eine Reihe von Dateien umzubenennen, die Leerzeichen enthalten, um die Leerzeichen zu entfernen. Ich dachte, ich hätte den richtigen Bash-Befehl gefunden:

%Vor%

Dies ergibt jedoch den Fehler "mv: target ist kein Verzeichnis" für jede Datei. Wenn ich im Befehl 'mv' durch 'echo mv' ersetze, wird für jede Datei der richtige mv-Befehl ausgegeben, und wenn ich diese mv-Befehle einzeln eintippe, funktionieren sie. Wenn ich zum Beispiel zwei Dateien habe, "a .txt" und "b .txt", und den obigen Befehl ausführen, bekomme ich:

%Vor%

Wenn ich den Befehl eintippe:

%Vor%

Ich bekomme:

%Vor%

Ich habe einen anderen Weg gefunden, dies mit "rename" zu tun, aber ich würde gerne wissen, warum das nicht funktioniert.

    
Jim Hines 23.10.2014, 00:19
quelle

1 Antwort

14

Versuchen:

%Vor%

Drei Punkte:

  1. Die Anführungszeichen um eine Shell-Variable sollten nicht maskiert sein.

  2. Im Allgemeinen ist es eine gute Idee, um jeden Verweis auf eine Shell-Variable doppelte Anführungszeichen zu setzen.

  3. ${f/ /} entfernt nur das erste Auftreten eines Leerzeichens. Um alle Leerzeichen zu entfernen, verwenden Sie ${f// /} .

Was ist schiefgegangen?

%Vor%

Der Ausdruck \"$f\" verhält sich nicht wie doppelt zitiert. Es wird auf zwei Argumente erweitert, z. B. "a und .txt" , wobei die doppelten Anführungszeichen wie normale Zeichen behandelt werden, genauso wie a ein normales Zeichen ist. Da es für mv ( "a und .txt" und a.txt ) drei Argumente gibt, glaubt mv , dass Sie versuchen, die ersten beiden Argumente in die dritte und die dritte in ein Verzeichnis zu verschieben. Da das dritte Verzeichnis kein Verzeichnis ist, wird eine Fehlermeldung ausgegeben.

    
John1024 23.10.2014 00:27
quelle

Tags und Links