Umbenennen einer Datei, deren Name ein Anführungszeichen enthält

10

Ich habe ein kleines Problem. Ein Client beauftragte mich mit der Migration von Websites von einem wirklich alten Server. Ich weiß nicht, wie sie dorthin gekommen sind, aber es gibt Dateien mit 'ihren Namen. Gibt es eine Möglichkeit, die Datei umzubenennen? mvscheint den Trick nicht zu tun.

ls zeigt es als 90843_O\\'ConnorPaul_GeneralManager.jpg

Wenn ich es versuche

 mv 90843_O\\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

es macht nichts mit dem >in der neuen Zeile, als würde es auf weitere Eingaben warten.

Wenn ich es versuche

mv 90843_O\'ConnorPaul_GeneralManager.jpg 90843_O_ConnorPaul_GeneralManager.jpg

Ich bekomme den Fehler

mv: kann nicht '90843_O \' ConnorPaul_GeneralManager.jpg 'angeben: Keine solche Datei oder kein solches Verzeichnis

Gibt es auch eine einfache Möglichkeit \', _in allen Dateien in einem bestimmten Ordner zu wechseln ?

Igor Yavych
quelle
1
Wenn Sie mehr Utils haben , vidirist dies eine einfache Lösung für diese Art von Problemen.
Derobert

Antworten:

5

Die Vervollständigung der Bash-Tabs sollte hier das Richtige tun können, wenn Sie nur die mv 90843_OTabulatortaste eingeben und drücken. Andernfalls können Sie dem Namen ordnungsgemäß entkommen:

mv "90843_O\\\\'ConnorPaul_GeneralManager.jpg" dest.jpg

Die doppelten Anführungszeichen machen das Escapezeichen überflüssig ', aber die beiden Backslash-Zeichen müssen noch maskiert werden (ein zusätzlicher Backslash für jedes Zeichen führt zu vier Backslashes). Eine weitere Option ist:

mv '90843_O\\'\'ConnorPaul_GeneralManager.jpg dest.jpg

Wenn Sie die Backslashes in einfache Anführungszeichen setzen, müssen Sie sie nicht mehr umgehen, aber Sie müssen die einfachen Anführungszeichen beenden, um ein Literal hinzuzufügen '. Dies wird nach dem Ende der Anführungszeichen maskiert.

Beachten Sie, dass das Problem hier genauso viel mit Backslashes im Namen zu tun hat wie mit dem einfachen Anführungszeichen. So ersetzen Sie die \\'Sequenz (da der Dateiname in der Frage zwei Backslashes enthält, verursachen beide Probleme) durch einen Unterstrich für alle Dateien in einem Verzeichnis mithilfe einer Schleife:

for file in *"\\\\'"*; do
  mv -i "$file" "${file//"\\\\'"/_}"
done

Das -iwird Sie mvauffordern, wenn Dateien überschrieben werden. Verwenden prename( renameLinks dazu auf vielen Systemen):

prename -n 's:\\\\'\'':_:g' *"\\\\'"*

Entfernen Sie das, -nwenn Sie glücklich sind, dass es tut, was Sie wollen. Beachten Sie, dass die Backslash-Zeichen hier innerhalb des Perl-Ausdrucks maskiert werden sollten, obwohl sie einfache Anführungszeichen enthalten (ohne die einfachen Anführungszeichen würden Sie acht Backslashes benötigen, da vier von der Shell entfernt würden und nicht Teil des Perl-Ausdrucks wären).

Graeme
quelle
4

Sie können renamefür solche Aufgaben verwenden:

➜  lab  ls                                               
1dsfa.file   6033dsfa.file                           90843_O\\'ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\'ConnorPaul_GeneralManager.jpg
➜  lab  rename "s/\'//g" *
➜  lab  ls
1dsfa.file   6033dsfa.file                           90843_O\ConnorPaul_GeneralManager.jpg
56dsfa.file  90843_O\\ConnorPaul_GeneralManager.jpg

Wenn Sie ersetzen möchten 'für _Sie auch Umbenennungs verwenden können:

rename "s/\'/_/g" *
Braiam
quelle
-2

Grrr, @Graeme hat mich geschlagen, aber ich werde trotzdem posten ...

Wenn Sie den Dateinamen in doppelte Anführungszeichen setzen, mv -v "90843_O'ConnorPaul_GeneralManager.jpg" 90843_O_ConnorPaul_GeneralManager.jpgreicht dies aus. Die Verwendung -vist optional, zeigt jedoch an, was sie getan hat. Ich glaube, es gibt noch einen zweiten Weg, außer allen Zeichen zu entkommen, wenn das überhaupt möglich ist. Der einzige Nachteil, den ich auf diese Weise kenne, ist, dass die Shell den Text verarbeitet, da er sich nicht in einfachen Anführungszeichen befindet, ihn aber überhaupt nicht manipuliert, da es sich nicht um internen Code handelt und die zusätzliche Zeit für die Verarbeitung bedeutungslos ist.

Gerade getestet, können Sie Zeichen wie >in einem Text in doppelten Anführungszeichen haben und es wird als Teil des Dateinamens genommen.

Als Tipp für die Zukunft, können Sie ./direkt vor dem Dateinamen , wenn es Probleme gibt, wie Dateien mit einem Bindestrich beginnen: mv ./-file filebenennt -filean file. In diesem Fall können Sie den Dateinamen ausnahmsweise nicht zitieren oder entkommen.

Seltsamerweise könnte ich die Datei erstellen, 90843_O'ConnorPaul_GeneralManager.jpgwenn ich dem einfachen Anführungszeichen von entkommen \'würde, aber es würde sie nicht erstellen, wenn sie nicht doppelt oder in Anführungszeichen gesetzt wäre.

PS: Die Bash-Vervollständigung ist eine andere Möglichkeit. Sie hat das Problem mit dem Dateinamen Ihrer Datei umgangen, funktioniert jedoch nicht mit "Bindestrich" -Dateien / -Ordnern. Schreiben Sie einfach einen Teil des Namens und drücken Sie die Tabulatortaste. Den Rest erledigt sie.

rautamiekka
quelle
Warum abstimmen? Ich habe vor den anderen geschrieben, aber ich war nicht schnell genug, um es zuerst zu veröffentlichen.
Rautamiekka
War ich nicht Keine Ahnung, wer abgestimmt hat.
Igor Yavych
1
Diese Antwort ist nicht richtig, sie ignoriert die Backslashes im Dateinamen, die tatsächlich schwieriger zu handhaben sind als das einfache Anführungszeichen.
Graeme