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.
Versuchen:
%Vor%Drei Punkte:
Die Anführungszeichen um eine Shell-Variable sollten nicht maskiert sein.
Im Allgemeinen ist es eine gute Idee, um jeden Verweis auf eine Shell-Variable doppelte Anführungszeichen zu setzen.
${f/ /}
entfernt nur das erste Auftreten eines Leerzeichens. Um alle Leerzeichen zu entfernen, verwenden Sie ${f// /}
.
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.