Ich bin kürzlich auf eine Datei gestoßen, deren Name mit dem Zeichen '♫' beginnt. Ich wollte diese Datei kopieren, einspeisen ffmpeg
und auf verschiedene andere Arten im Terminal referenzieren. Normalerweise vervollständige ich seltsame Dateinamen automatisch, aber dies schlägt fehl, da ich nicht einmal den ersten Buchstaben eingeben kann.
Ich möchte nicht zur Maus wechseln, um ein Kopieren-Einfügen-Manöver auszuführen. Ich möchte nicht eine Reihe von Codes für mögliche Szenarien auswendig lernen. Meine Ad-hoc-Lösung bestand darin, in das betreffende Zeichen zu wechseln vim
, es einzufügen !ls
und zu kopieren, es dann zu beenden und in das Terminal einzufügen. Dies hat funktioniert, ist aber ziemlich schrecklich.
Gibt es eine einfachere Möglichkeit, mit solchen Szenarien umzugehen?
HINWEIS: Ich verwende die Fischschale, wenn sich etwas ändert.
quelle
*restoffile.avi
oder so ähnlich?touch '♫ 漢字カ'
touch '♫ 漢字タ'
Antworten:
Wenn das erste Zeichen des Dateinamens druckbar ist, aber weder alphanumerisch noch Leerzeichen, können Sie den
[[:punct:]]
Glob-Operator verwenden:quelle
Das einfachste, was mir
ls [^a-zA-Z0-9]*
in den Sinn kommt, ist und macht den Trick für mich, aber Terdons Antwort ist besser darin, die Aufmerksamkeit auf die extglob-Shell-Option oder sogar einen Shell-unabhängigen Ansatz zu lenken.quelle
ls [^[:alnum:]]*
für die gleiche Sache. Aber es ist besser, die Charakterklasse zu verwenden, die es ist , als die Klasse (n), die es nicht ist ; Daherls [[:punct:]]*
wird diese Datei aufgelistet.ls hat einige Schalter (wie --quote-name, --escape, --literal) für den Umgang mit nicht druckbaren Zeichen, aber in diesem Fall scheint das Zeichen "druckbar", aber nicht "tippbar" zu sein (zumindest auf meiner Tastatur! ), so scheint keiner dieser Schalter zu helfen.
Daher können Sie als allgemeine "Brute Force" -Methode Dateien mit beliebigen Zeichen im Namen entfernen:
Suchen Sie die Zeile mit der fehlerhaften Datei. Sehr wahrscheinlich ist es die erste Zeile, aber sagen wir, es ist die fünfte. Zeile 5 drucken und hexadezimal codieren:
Ignorieren Sie das Zeichen 0a (Newline), erstellen Sie eine Escape-Zeichenfolge und verwenden Sie die Option -e von echo, um die Escape-Zeichen zu übersetzen:
Jetzt können Sie es wie folgt kopieren / verschieben / löschen:
Wenn Sie nicht auf die Verwendung von Shell-Skripten beschränkt sind, können Sie dies auch in Python folgendermaßen tun:
Mit diesem Ansatz können Sie viele Dateien verarbeiten. Sie müssen lediglich die Logik für die Auswahl der richtigen Dateien schreiben und sie umbenennen, ohne sie zu beschädigen.
quelle
Ein ähnlicher Ansatz wäre, alle Dateien aufzulisten, die nicht mit "normalen" Zeichen beginnen. In Bash können Sie dies mit
Dies scheint jedoch nicht verfügbar zu sein
fish
, sodass Siefind
stattdessen Folgendes verwenden könnten :quelle
Benennen Sie Symlinks um
Ein Ansatz zum Behandeln von Dateinamen mit Sonderzeichen - als erste Zeichen oder an einer anderen Stelle im Dateinamen - ist das Umbenennen in einfachere Namen .
Dies kann auch verwendet werden, wenn Sie die ursprünglichen Dateinamen beibehalten müssen: Benennen Sie eine Kopie der Dateinamen um.
Dazu können Sie die Dateien kopieren, aber auch Symlinks oder Hardlinks zu den Dateien erstellen und diese umbenennen.
cp
Erstellt Symlinks anstelle von Kopien mit der Option-s
(-l
für Hardlinks).Verwenden Sie "Detox", um Namen zu reinigen
detox
Kann zum Umbenennen in saubere Dateinamen verwendet werden. Es benennt Dateien um, um Dateinamen nach verschiedenen Regeln zu bereinigen, die in einerdetoxrc
Datei definiert sind . Standardmäßig werden die UTF8-Zeichen nur entfernt. Mit der Option werden-s utf_8-only
sie ersetzt durch_
:"Entgiftung" bei Symlinks
Kombiniert mit der Bearbeitung von Symlinks wie oben beschrieben:
quelle
Ich verwende es nicht
fish
, aber die Dokumentation besagt, dass Sie ein Unicode-Zeichen eingeben können, indem Sie dem Hex-Zeichencode\u
(für 16-Bit-Zeichen) oder\U
(für 32-Bit-Zeichen) voranstellen. Ich denke, der Code für♫
ist491eb
, also könnten Sie tun:umbenennen
♫abc.mp3
.Beachten Sie, dass Sie die führenden Nullen benötigen, da diese sonst
abc
am Ende als Hexadezimalziffern und als Teil des Zeichencodes behandelt werden. Für ein 32-Bit-Zeichen müssen Sie 8 Ziffern eingeben.quelle
Ich weiß nicht, ob dies bereits 2014 der Fall war, als Sie die Frage gestellt haben, aber in den aktuellen Versionen von
fish
(ab 2019) können Sie Tabzweimal drücken , um eine Auswahl im zsh-Stil zu erhalten, für die Sie die Pfeiltasten verwenden können Wählen Sie die gewünschte Datei visuell aus, ohne einen Teil des Dateinamens eingeben zu müssen.quelle
Fish unterstützt keine Platzhalter für Klammern ¹.
Der Befehl nicht in versteckten Verzeichnissen und zeigt Dateinamen suchen , die mit den Zeichen nicht beginnen
letters
,digits
,.
_
-
(siehe die Dokumentationfind
).Hinweis:
$argv
Ist eine spezielle Array-Variable (Fish Shell), die die Funktionsargumente enthält. Daher kann der zugrunde liegende Befehl einen beliebigen Ausdruck (z . B. Alias ) erhalten.¹ Tatsächlich unterstützt Fish die Erweiterung von Klammern (Array-Variablenerweiterung), Bash verwendet jedoch eine andere Terminologie (Parameter- und Dateinamenerweiterungen).
quelle
Verwenden
zsh
und tippen Sie, was als nächstes kommt. ZSH unterstützt Fuzzy Auto Complete und kann damit umgehen. (Besonders schön mit dem OH-MY-ZSH-Plugin .)quelle
Sie haben nicht gesagt, ob Sie diese problematischen Dateinamen beibehalten möchten. Eine Lösung könnte darin bestehen, das Problem ein für alle Mal zu beheben, indem Sie (einige oder alle) Ihrer Dateien in Namen umbenennen, die Sie durch Ausführen dieses Skripts eingeben können:
Daraufhin werden Ihre vorhandenen Dateinamen aufgelistet, gefolgt von
...?
. Geben Sie einfach Folgendes ein Enter, um eine Datei unverändert zu lassen. oder geben Sie einen neuen Namen ein, um ihn umzubenennen. Bei-i
Auswahl dieser Option werden Sie aufgefordert, das Überschreiben zu bestätigen, wenn Sie den Namen einer anderen vorhandenen Datei angeben.Dieses Skript kann auf verschiedene Arten geändert werden:
*
) beispielsweise einschränkend ändern*.avi *.mov
, damit Sie nicht jede Datei überprüfen müssen.mv
zucp
, so dass Sie eine Kopie der Datei mit dem aktuellen Namen behalten und erstellen Sie ein (temporären?) Kopie mit einem typisierbarem Namen.Sie können einen neuen Dateinamen erstellen, der auf dem vorhandenen Dateinamen basiert. Beispielsweise,
Hiermit können Sie ein Präfix vor den alten Namen setzen. Wenn Sie ein eindeutiges Präfix ausgewählt haben, können Sie die automatische Vervollständigung verwenden.
quelle