Installieren

Installieren

Hier ist ein absoluter Anfänger, der versucht, Code zu schreiben, um das erste Leerzeichen aus einer Reihe von Dateinamen zu entfernen.

Wenn ich im Terminal eingebe:

#!/bin/bash

for f in *.jpg; do echo mv "$f" “${f/ /}”; done

Ich bekomme:

mv R 1  Pe.jpg “R1 Pe.jpg”
mv R 10 Ma.jpg “R10 Ma.jpg”
mv R 11 An.jpg “R11 An.jpg”

Aber wenn ich Echo entferne, findet die eigentliche Umbenennung nicht statt und ich erhalte diesen Fehler:

for f in *.jpg; do mv "$f" “${f/ /}”; done
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

Irgendwelche Vorschläge?

Antwort1

Das sind keine Zitate. Sie haben nicht ":

$ uniprops “
U+201C ‹“› \N{LEFT DOUBLE QUOTATION MARK}
    \pP \p{Pi}
    All Any Assigned Punct Is_Punctuation Common Zyyy Pi P General_Punctuation
       InPunctuation Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase
       Initial_Punctuation Pat_Syn Pattern_Syntax PatSyn Print X_POSIX_Print
       Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct


$ uniprops '"'
U+0022 ‹"› \N{QUOTATION MARK}
    \pP \p{Po}
    All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
       Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
       Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
       X_POSIX_Print Punctuation QMark Quotation_Mark Unicode X_POSIX_Punct

Da die Anführungszeichen in den Zielnamen keine richtigen doppelten Anführungszeichen sind, würde das zweite Argument an Leerzeichen getrennt und der erste mvBefehl würde versuchen, die beiden Dateien in ein nicht vorhandenes Verzeichnis zu verschieben R 1 Pe.jpg. “R1Dies Pe.jpg”verursacht die Fehler.

Versuchen Sie Folgendes:

for f in *.jpg; do echo mv "$f" "${f/ /}"; done

Antwort2

Ja, es ist ein Zitierproblem (siehe andere Antworten).

Für dieses spezielle Problem ist es jedoch besser, den renameBefehl zu verwenden. (Der von Larry Wall)

z.B

rename -n -e "s/ //" *.jpg

Nach dem Testen und Überprüfen der Ausgabe. Entfernen Sie die -n.

Installieren

Unter Debian mit apt install rename.

Antwort3

Ja, die Anführungszeichen sind ein Problem. Das Echo zeigt den Befehl wie folgt an:
mv R 1 Pe.jpg “R1 Pe.jpg”
Wenn Sie dies in die Befehlszeile eingeben würden, würde es fehlschlagen, da die Leerzeichen in der Quelle weder in Anführungszeichen noch maskiert sind. Der richtige Befehl wäre:
mv "R 1 Pe.jpg" "R1 Pe.jpg"
Um die Variable $f in Anführungszeichen zu setzen, würde ich so etwas vorschlagen:
mv "\""$f"\"" "${f/ /}"
wobei "\"" der Escape-Code zum Drucken eines doppelten Anführungszeichens ist.
Nämlich: echo " n " zeigt an n. echo " \n " maskiert das n und zeigt eine neue Zeile an. Ebenso echo " \" "maskiert ein Anführungszeichen innerhalb von Anführungszeichen.
Eine andere Option wäre:
mv '"'$f'"' "${f/ /}"

verwandte Informationen