.png)
Ich bin kürzlich auf eine Datei gestoßen, deren Name mit dem Zeichen „♫“ beginnt. Ich wollte diese Datei kopieren, sie in einfügen ffmpeg
und sie auf verschiedene andere Arten im Terminal referenzieren. Normalerweise vervollständige ich seltsame Dateinamen automatisch, aber das schlägt fehl, da ich nicht einmal den ersten Buchstaben eingeben kann.
Ich möchte nicht zur Maus wechseln, um ein Kopier- und Einfügemanöver durchzuführen. Ich möchte mir nicht einen Haufen Codes für mögliche Szenarien merken. Meine Ad-hoc-Lösung bestand darin, in zu wechseln vim
, das betreffende Zeichen einzufügen !ls
und zu kopieren, dann zu beenden und es in das Terminal einzufügen. Das hat funktioniert, ist aber ziemlich schrecklich.
Gibt es einen einfacheren Weg, mit solchen Szenarien umzugehen?
NOTIZ:Ich verwende die Fischschale, wenn dadurch etwas geändert wird.
Antwort1
Wenn das erste Zeichen des Dateinamens druckbar ist, aber weder alphanumerisch noch ein Leerzeichen enthält, können Sie [[:punct:]]
den Glob-Operator verwenden:
$ ls *.txt
f1.txt f2.txt ♫abc.txt
$ ls [[:punct:]]*.txt
♫abc.txt
Antwort2
Das Einfachste, was mir einfällt, ist ls [^a-zA-Z0-9]*
und es funktioniert bei mir, aber Terdons Antwort macht besser auf die Extglob-Shell-Option oder sogar einen Shell-unabhängigen Ansatz aufmerksam.
Antwort3
ls verfügt über einige Schalter (wie --quote-name, --escape, --literal) zum Umgang mit nicht druckbaren Zeichen, aber in diesem Fall scheint das Zeichen „druckbar“, aber nicht „eingebbar“ zu sein (zumindest auf meiner Tastatur!), also scheint keiner dieser Schalter zu helfen.
Daher können Sie als allgemeine Methode zum Löschen von Dateien mit beliebigen Zeichen im Namen mit roher Gewalt Folgendes tun:
$ /bin/ls -1A|cat -n # list all files (except . and ..), 1 per line, add line numbers
1 ♫
2 f1.txt
3 f2.txt
Suchen Sie die Zeile, die die fehlerhafte Datei enthält. Höchstwahrscheinlich ist es die 1. Zeile, aber nehmen wir an, es ist die 5. Zeile. Drucken Sie Zeile 5 und kodieren Sie sie in Hexadezimalformat:
$ /bin/ls -1A|sed -n 5p|xxd -g 1
0000000: e2 99 ab 0a ....
Ignorieren Sie das Zeichen 0a (Neue Zeile), konstruieren Sie eine Escape-Zeichenfolge und verwenden Sie die Option -e von echo, um die Escape-Zeichen zu übersetzen:
$ echo -e '\xe2\x99\xab'
♫
Jetzt können Sie es wie folgt kopieren/verschieben/löschen:
$ cp -vi $(echo -e '\xe2\x99\xab') better_name
‘♫’ -> ‘better_name’
Wenn Sie nicht auf die Verwendung von Shell-Skripten beschränkt sind, können Sie dies auch folgendermaßen in Python tun:
$ python
>>> import os
>>> os.listdir('.')
[ ..., '\xe2\x99\xab', ... ]
>>> print '\xe2\x99\xab'
♫
>>> import shutil
>>> shutil.copy('\xe2\x99\xab', 'better_name')
Mit diesem Ansatz können Sie viele Dateien verarbeiten. Sie müssen lediglich die Logik zum Auswählen der richtigen Dateien und zum Umbenennen ohne Überschreiben usw. schreiben:
for f in os.listdir('.'):
if not f.isalnum():
newname = generate_newname(f)
if not os.path.exists(newname):
shutil.copy(f, newname)
else:
print newname, 'already exists!'
Antwort4
Symlinks umbenennen
Ein Ansatz zum Umgang mit Dateinamen mit Sonderzeichen - als erste Zeichen oder an anderer Stelle im Dateinamen - besteht darin,in einfachere Namen umbenennen.
Dies kann auch verwendet werden, wenn SieBehalten Sie die ursprünglichen Dateinamen bei: Eine Kopie der Dateinamen umbenennen.
Dies kann durch Kopieren der Dateien erfolgen, aber auch durch ErstellenSymlinks oder Hardlinkszu den Dateien und benennen Sie diese um. Erstellt mit der Option ( für Hardlinks) cp
statt Kopien Symlinks .-s
-l
Verwenden Sie "Detox", um Namen zu bereinigen
Zum Umbenennen in saubere Dateinamen,detox
kann verwendet werden; Es benennt Dateien um, um Dateinamen nach verschiedenen Regeln zu bereinigen, die in einemdetoxrc
Datei. Standardmäßig werden die UTF8-Zeichen einfach entfernt; mit der Option -s utf_8-only
werden sie ersetzt durch _
:
$ touch '♫ 漢字カ' ♫foo
$ ls -1
♫foo
♫ 漢字カ
$ detox -s utf_8-only *
$ ls -1
_ ___
_foo
"Entgiftung" von Symlinks
Kombiniert mit der Arbeit an symbolischen Links wie oben beschrieben:
$ mkdir orig
$ cd orig
$ touch '♫ 漢字カ' ♫foo
$ cd ..
$ mkdir clean
$ cd clean
$ cp -s ../orig/* .
$ ll
lrwxrwxrwx 1 14 Oct 8 05:52 ♫foo -> ../orig/♫foo
lrwxrwxrwx 1 21 Oct 8 05:52 ♫\ 漢字カ -> ../orig/♫\ 漢字カ
$ ls -1
♫foo
♫ 漢字カ
$ detox --special -s utf_8-only *
$ ll
lrwxrwxrwx 1 21 Oct 8 05:52 _\ ___ -> ../orig/♫\ 漢字カ
lrwxrwxrwx 1 14 Oct 8 05:52 _foo -> ../orig/♫foo