Ich habe einen Tippfehler gemacht:
$ history
169 9:34 la /usr/local/etc/
170 9:35 sudo mkdir ^C
171 9:36 sudo mkdir /usr/local/etc/dnsmasq.d
Jetzt habe ich eine Datei mit dem Namen ^ C (Strg + C) !! Wenn ich benutze, ls
sehe ich nur ein Fragezeichen (wahrscheinlich aufgrund des Gebietsschemas?)
% ls -al
total 60
drwxr-xr-x 2 root wheel 512 Jan 21 09:35 ? <- this one
drwxr-xr-x 5 admin wheel 512 Jan 21 16:24 .
drwxr-xr-x 3 root wheel 512 Jan 20 14:29 ..
-rw-r--r-- 1 admin nobody 1114 Jan 20 19:10 .cshrc
-rw------- 1 admin wheel 6002 Jan 21 15:27 .history
-rw-r--r-- 1 admin nobody 182 Jan 20 14:29 .login
-rw-r--r-- 1 admin nobody 91 Jan 20 14:29 .login_conf
-rw------- 1 admin nobody 301 Jan 20 14:29 .mail_aliases
-rw-r--r-- 1 admin nobody 271 Jan 20 19:04 .mailrc
-rw-r--r-- 1 admin nobody 726 Jan 20 19:05 .profile
-rw------- 1 admin nobody 212 Jan 20 14:29 .rhosts
-rw-r--r-- 1 admin nobody 911 Jan 20 19:06 .shrc
drwx------ 2 admin nobody 512 Jan 20 15:05 .ssh
drwxr-xr-x 2 admin wheel 512 Jan 20 19:08 bin
und
% ls -i
3611537 ? 3611534 bin
Ich möchte diese Datei entfernen. Ich versuche mv
und wenn ich die Tab-Vervollständigung benutze, zeigt es mir:
% mv
^C/ bin/
Offensichtlich kann ich kein ^ C: - / eingeben. Wie entferne ich diese Datei?
filesystems
freebsd
Mausy5043
quelle
quelle
dsw
es nicht in POSIX geschafft hat.emacs -nw -f dired
gibt einen Verzeichnisnavigator. <kbd> D </ kbd> löscht nach Bestätigung die Datei unter dem Cursor.Antworten:
^V
( ctrl+ v) fungiert als eine Art Escape-Sequenz für den nächsten Tastendruck und fügt den zugeordneten Wert ein, anstatt die normalerweise zugeordneten Aktionen auszuführen.Wenn Sie dies verwenden, sollte
^V^C
( ctrl+ v, ctrl+ c) funktionieren, um Ihren schwierigen Dateinamen in das Terminal einzugeben.quelle
^V^C
hat nicht funktioniert in der Zsh Zeileneditor; Das Quoted-Insert- Widget (Suche auf der Seite nach^V
) fügt explizit keine Interrupt-Zeichen ein. Jakobs Antwort (mit printf) ist möglicherweise eine portablere Möglichkeit, ein Steuerzeichen in einem Shell-Argument anzugeben.Sie können die Datei auch mit inode entfernen:
Was auch immer Sie tun, um Gottes willen, stellen Sie nicht
-delete
vor-inum
:Herzlichen Glückwunsch, Sie haben gerade alle Ihre Dateien gelöscht. Bei
find
ist die Reihenfolge der Argumente wichtig !quelle
-delete
vorher stellen-inum
? Ist dies nur eine Vorsichtsmaßnahme für den Fall, dass Sie die Eingabetaste vorzeitig drücken, oder hat die Reihenfolge der Argumente tatsächlich Einfluss auf das Ergebnis?-delete
den Befehl erst ein, nachdem Sie den Befehl ausgeführt haben, ohne-delete
zu überprüfen, ob der gewünschte Befehl gefunden wurde .-print
statt-delete
macht einen sehr guten Test.Eine andere Option ist zu verwenden
rm -ri ./*
;rm
werden Sie vor dem Löschen einer Datei und eines Verzeichnisses gefragt, sodass Sie nury
auf die "fehlerhafte" Datei undn
auf alle anderen antworten müssen .In Ihrem Fall können Sie sogar die Anzahl der Antworten reduzieren
rm -ri ./?
, da Ihre "fehlerhafte" Datei nur ein Zeichen lang ist.quelle
select f in ?; do rm -i "$f"; break; done
hat alle Vorteile von-i
, ohne die Qual, aufno
führende unerwünschte Ereignisse antworten zu müssen oder fälschlicherweise Ja zu einem zu sagen, den Sie behalten möchten.rmdir ?/
entfernt alle leeren Einzelzeichenverzeichnisse und beschwert sich darüber, dass die anderen nicht leer sind.select
es das gibt, ziemlich ordentlich!-r
(und./
- es ist immer leicht zu vergessen), darmdir
die-i
Flagge leider nicht unterstützt wird . Trotzdem denke ich, dass in diesem Fall der beste Weg eine Kombination aus Bischof und Ihrem Kommentar wäre.select
nur in einigen Shells, weshalb Sie wahrscheinlich nicht darauf gestoßen sind. Skripte und Lösungen, die portabel sein sollen, vermeiden dies, sodass wir es weniger wahrscheinlich "in the wild" sehen.Eine Möglichkeit ist, den Dateinamen mit etwas anderem als nachzuschlagen
ls
. Wenn Sie wissen, dass es von einem wörtlichen Ctrl+ erzeugt wurde C, können Sie das ASCII-Zeichen anhand einer Tabelle mit Steuerzeichen oder mit einer benutzerfreundlicheren Oberfläche wie der von Python finden:Eine andere Möglichkeit wäre, einen hexadezimalen Speicherauszug der Ausgabe von
ls
zhexdump
.Dann können Sie die Datei mit (zum Beispiel) diesem Bash-Befehl löschen:
(Die doppelten Anführungszeichen werden nur benötigt, wenn sich das Zeichen, das Sie drucken möchten, in Ihrer
IFS
Variablen wie\x20
oder\x0A
befindet. Es ist jedoch eine gute Angewohnheit, Befehlsersetzungen in Anführungszeichen zu setzen, es sei denn, Sie möchten, dass die Shell eine Feldaufteilung durchführt usw.)quelle
cat -v
(Plusman ascii
) kann für den ersten Teil helfen.os.rmdir('\x03')
direkt aus der Python-Shell.In solchen Situationen ist es häufig einfach, ein Platzhaltermuster zu finden, das mit der entsprechenden Datei übereinstimmt.
In Ihrem Fall wäre dies einfach
?
(Abgleichen aller Dateinamen mit genau einem Zeichen).Überprüfen Sie einfach, ob es wirklich Ihren Wünschen entspricht:
Und dann das Verzeichnis entfernen:
Sie können dies auch mit der Tab-Vervollständigung kombinieren . Du kannst Tippen
und drücken Sie die Tabulatortaste, und z. B. in der Bash wird es durch ersetzt
und Sie können dann die Eingabetaste drücken und es macht, was Sie wollen.
quelle
Sie können Midnight Commander (mc) zum Löschen der Datei verwenden - wählen Sie sie einfach mit den Auf- / Ab-Tasten aus und drücken Sie F8.
Ich habe das gelegentlich gemacht, als Dateinamen aufgrund der Kodierung seltsame Zeichen hatten.
quelle
Noch eine andere Möglichkeit: Verwenden Sie
stat
diese Option, um eine maskierte Darstellung des Verzeichnisnamens zu erhalten:Jetzt kennen Sie eine Darstellung des Dateinamens, sodass Sie die Datei nach Namen entfernen können, indem Sie Folgendes verwenden
printf
:Wenn Sie Bash verwenden, können Sie Folgendes vermeiden
printf
:quelle
$'\x03'
ist es einfacher als printf aufzurufen. Dasselbe gilt für FreeBSD sh, das über die POSIX-Shell mit einigen leckeren Funktionen erweitert wurde.$'...'
, aber ich würde unnötige Konvertierung von Oktal in Hexadezimal im Allgemeinen vermeiden. Was wäre, wenn die Datei'\111'
(in derstat
Ausgabe) benannt wäre? Würden Sie es trotzdem mit entfernen$'\x49'
? Verwendenstat
Sie besser die gleiche Reihenfolge, die Sie angegeben haben: im Fall des OPrmdir $'\003'
.Eine Lösung, die für mich funktioniert hat, ist:
um durch die verfügbaren Dateien zu blättern, bis ich die gefunden habe, die ich entfernen möchte.
Sie müssen jedoch die erforderlichen Einstellungen in Ihrer Shell haben, damit dies funktioniert.
quelle
Am einfachsten ist es, alles in das temporäre Verzeichnis zu verschieben und dann
rm -r DIRNAME
.quelle
^v
habe mich aber ewig durchgearbeitet.^V
benötigen spezielle Kenntnisse, während das Verschieben von Dateien und das Entfernen des übergeordneten Verzeichnisses aus den Grundlagen abgeleitet werden kann.Wenn es das einzige leere Verzeichnis ist (oder Sie keine Lust haben, andere leere Verzeichnisse zu entfernen), verwenden Sie
rmdir */
. Es wird eine Fehlermeldung angezeigtrmdir
, dass nicht leere Verzeichnisse nicht entfernt werden können, aber das ist in Ordnung. GNUrmdir
unterstützt--ignore-fail-on-non-empty
, oder Sie könnten2>/dev/null
.Durch
/
das Nachstellen stimmt der Glob nur mit den Verzeichnisnamen überein.Sie können im Voraus prüfen, welche leeren Verzeichnisse unter dem aktuellen mit vorhanden sind
find -maxdepth 1 -type d -empty -ls
. (Und Sie können die ändern-ls
,-delete
wenn Sie möchten).Sie können einen spezifischeren Glob-Ausdruck verwenden
rmdir [^A-Za-z0-9._]/
, um Verzeichnisse abzugleichen , die mit einem nicht alphanumerischen Dateinamen oder einem Unterstrich beginnen. Ich habe auch eingeschlossen.
, aber Glob-Ausdrücke stimmen.
sowieso nicht normal überein .Wie bereits erwähnt, können Sie den Namen auf einzelne Zeichen mit einem Globus aus
?
folgenden Elementen beschränken :rmdir ?/
rmdir
Keine-i
Option, wie es der Fallrm
ist, vermutlich, weil leere Verzeichnisse normalerweise nicht wertvoll sind und einfach neu erstellt werden können.quelle
rmdir
können Ihnen mitteilen, ob Sie die-v
Option an sie übergeben (zumindest in GNU).find -maxdepth 1 -type d -empty -ls
Bevor Sie etwas riskantes unternehmen, versuchen Sie Folgendes:
Im Allgemeinen - ist ein Trennzeichen, das angibt, dass dem Befehl keine -o-Punkte folgen, aber es ermöglicht auch, dass seltsame Zeichen nicht als etwas anderes interpretiert werden.
Ein weiteres Anwendungsbeispiel ist
whois -r -- "-r OBJECT-RIPE"
(-r ist eine Abkürzung für reif, aber im reifen whois auch ein Parameter)
Wenn es beim ersten Versuch nicht funktioniert, versuchen Sie es vielleicht
rmdir -- "^C"
Aber in meiner csh-Shell brauche ich nichts davon, es
rmdir ^C
funktioniert einfach schon für mich.quelle
rmdir
tippen, gefolgt von <ctrl> C funktioniert? Ja wirklich?! Ich würde erwarten, dass es sich anders verhält, nämlich denrmdir
Befehl abzubrechen und Sie zur Befehlszeile zurückzukehren.