2016-06-24 13 views
0

Ich habe einen Ordner, der automatisch erstellt wurde. Der Benutzer hat unbeabsichtigt intelligente (lockige) Anführungszeichen als Teil des Namens angegeben, und der Prozess, der die Eingaben bereinigt, hat diese nicht erfasst. Daher enthält der Ordnername die intelligenten Anführungszeichen. Zum Beispiel:So benennen Sie einen Ordner mit intelligenten Anführungszeichen um

this-is-my-folder’s-name-“Bob” 

Ich versuche jetzt umbenennen/entfernen die Ordner in der Befehlszeile, und keine der Standard-Tricks für den Umgang mit Dateien/Ordner mit Sonderzeichen (in Anführungszeichen gesetzt, um die Zeichen zu entkommen, versuchen, es nach Inode umzubenennen usw.) funktionieren. Alle Ergebnisse in:

mv: cannot move this-is-my-folder’s-name-“Bob” to this-is-my-folders-name-BOB: No such file or directory 

Kann mir jemand einen Rat geben, wie ich das erreichen kann?

+1

Haben Sie 'rm -i - this-is- *' ausprobiert? – skhan

+0

Ich glaube Backslash Escaping von Sonderzeichen wird das Problem lösen. Verwenden Sie die bash-Shell selbst, um den Namen des Quellordners zu vervollständigen, indem Sie 'tap' drücken, nachdem Sie einige Zeichen des Quellordners eingegeben haben. Geben Sie dann den Namen des Zielordners ein. – Jobin

+0

Sie können immer alle Dateien (oder eine Teilmenge der Dateien) in einem Array globalisieren, z. B. 'files = (this-is-my-folder *)'. Dies erzeugt ein Array 'Dateien'. Untersuchen Sie dieses Array mit 'declare -p files'. Sehen Sie, um welchen Index Ihre Datei geht; zum Beispiel, wenn Sie es bei Index '42' finden, dann wird 'mv -" $ {files [42]} "this-is-my-folders-name-BOB' funktionieren. Übrigens, hat die TAB-Fertigstellung nicht funktioniert? –

Antwort

0

Um den Namen in einem Format erhalten Sie in der Shell-and-Paste kopieren:

printf '%q\n' this* 

... drucken aus dem Dateinamen in einer Art und Weise wird die Shell als gültige Eingabe akzeptieren. Das könnte etwa so aussehen:

$'this-is-my-folder200\231s-name-200\234Bob200\235' 

...die Sie dann als Argument an mv verwenden:

mv $'this-is-my-folder200\231s-name-200\234Bob200\235' this-is-my-folders-name-BOB 

Übrigens, wenn Ihr Betriebssystem auf die gleiche Weise funktioniert Mine tut (wenn der Test oben ausgeführt wird), würde dies erklären, warum Einzelzeichen Klackse mit wie ? für diese Zeichen hat nicht funktioniert: Sie sind tatsächlich mehr als ein Byte lang jeder!

+0

Danke Charles! Das hat es gelöst !!! –

+0

'?' Sollte funktionieren, wenn Sie ein geeignetes Gebietsschema haben ... –

0

Sie können mit Shell Globbing Token ? für ein einzelnes Zeichen entsprechen, so die typografischen Anführungszeichen passenden ? verwenden tun soll:

mv this-is-my-folder?s-name-?Bob? new_name 

Hier die typographischen mit ? ersetzt den Dateinamen übereinstimmen.

0

Es gibt mehrere Möglichkeiten.

  • Wenn ein Anfangsstring der Namensdatei vor dem ersten Zitat endet innerhalb des Verzeichnisses eindeutig zuzuordnen ist, dann können Sie Vervollständigung von Dateinamen verwenden, um Ihr einen entsprechenden Befehl eingeben zu können. Geben Sie "mv" (ohne die Anführungszeichen) und den eindeutigen ersten Teilstring ein und drücken Sie die TAB-Taste, um den Abschluss des Dateinamens anzufordern. Bash vervollständigt den Dateinamen mit den richtigen Zeichen, die korrekt maskiert sind.

  • Verwenden Sie einen grafischen Dateibrowser. Dann können Sie die umzubenennende Datei auswählen, indem Sie darauf klicken. (Details darüber, wie Sie von dort fortfahren, hängen vom Browser ab.) Wenn Sie kein grafisches Terminal haben und es nicht bekommen können, können Sie dasselbe auch mit einem Textmodus-Browser wie Midnight Commander tun.

  • Ein einfaches glob mit dem Wildcard ? oder * gebaut sollte

    der Lage sein,
  • verwenden eine komplexere glob den Dateinamen entsprechen den Dateinamen auszuwählen, und vielleicht andere mit dem gleichen Problem. Vielleicht würde so etwas wie *[^a-zA-Z0-9-]* tun. Verwenden Sie eine Musterersetzung, um einen neuen Namen zuzuweisen. Etwas wie folgt aus:

for f in *[^a-zA-Z0-9-]*; do 
    mv "$f" "${f//[^a-zA-Z0-9-]/}" 
done 

Die Substitution ersetzt alle Erscheinungen eines Zeichen, die nicht Dezimalstellen, appercase oder Klein lateinischen Buchstaben sind oder Bindestriche mit nichts (das heißt, sie streift sie). Passen Sie jedoch auf, bevor Sie dies verwenden, um sicherzustellen, dass Sie nicht mehr Änderungen vornehmen, als Sie vorhaben.

+0

@gniourf_gniourf, guter Punkt. behoben –

Verwandte Themen