Zrobiłem literówkę:
$ history
169 9:34 la /usr/local/etc/
170 9:35 sudo mkdir ^C
171 9:36 sudo mkdir /usr/local/etc/dnsmasq.d
Teraz mam plik o nazwie ^ C (ctrl + C) !! Kiedy używam ls
, po prostu widzę znak zapytania (prawdopodobnie z powodu ustawień regionalnych?)
% 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
i
% ls -i
3611537 ? 3611534 bin
Chcę usunąć ten plik. Próbuję, mv
a przy użyciu uzupełniania tabulatorów pokazuje mi:
% mv
^C/ bin/
Oczywiście nie mogę wpisać ^ C: - / Jak usunąć ten plik?
filesystems
freebsd
Mausy5043
źródło
źródło
dsw
nie przeszedł na POSIX.emacs -nw -f dired
daje nawigator katalogów. <kbd> D </kbd> usuwa plik pod kursorem po potwierdzeniu.Odpowiedzi:
^V
( ctrl+ v) działa jako rodzaj sekwencji ucieczki dla następnego naciśnięcia klawisza, wstawiając powiązaną wartość zamiast wykonywania czynności, które normalnie byłyby powiązane.Korzystając z tego,
^V^C
( ctrl+ v, ctrl+ c) powinien działać, aby wprowadzić trudną nazwę pliku w terminalu.źródło
^V^C
ma nie pracować w edytorze linii zsh; quoted-insert widget (przeszukać stronę dla^V
) wyraźnie nie wstawić znaki przerwań. Odpowiedź Jakoba (za pomocą printf) może być bardziej przenośnym sposobem dostarczenia znaku kontrolnego w argumencie powłoki.Możesz także usunąć plik za pomocą i-węzła:
Cokolwiek robicie, na miłość boską, nie stawiajcie
-delete
przedtem-inum
:Gratulacje, właśnie wyczyściłeś wszystkie swoje pliki. Z
find
, kolejność argumentów ma znaczenie !źródło
-delete
wcześniej-inum
? Czy to tylko środek ostrożności w przypadku przedwczesnego naciśnięcia klawisza Enter lub kolejność argumentów faktycznie wpływa na wynik?-delete
polecenia, kropka, dopóki nie uruchomisz polecenia bez-delete
sprawdzenia, czy znajduje to, czego szukasz.-print
zamiast-delete
robi bardzo dobry test.Inną opcją jest użycie
rm -ri ./*
;rm
zapyta cię przed usunięciem dowolnego pliku i katalogu, więc musisz tylko odpowiedziećy
na „zły” plik in
na wszystkie pozostałe.W rzeczywistości możesz nawet zmniejszyć liczbę potrzebnych odpowiedzi
rm -ri ./?
, ponieważ „zły” plik ma tylko jeden znak.źródło
select f in ?; do rm -i "$f"; break; done
ma wszystkie zalety-i
, bez męki polegającej na tym, że trzeba odpowiadaćno
na wiodące działania niepożądane lub omyłkowo odpowiadać tak na osobę, którą chcesz zatrzymać.rmdir ?/
usunie wszystkie puste katalogi jednoznakowe i narzeka, że inne nie są puste.select
istnieje, całkiem fajnie!-r
(i./
- zawsze łatwo zapomnieć) do moich przykładów, ponieważ niestetyrmdir
nie obsługuje-i
flagi. Przypuszczam jednak, że w tym przypadku najlepszym rozwiązaniem będzie połączenie wypowiedzi biskupa i twojego komentarza.select
istnieje tylko w niektórych powłokach, prawdopodobnie dlatego go nie spotkałeś - skrypty i rozwiązania, które mają być przenośne, unikają go, więc mniej prawdopodobne jest, że zobaczymy go „na wolności”.Jedną z opcji jest sprawdzenie nazwy pliku za pomocą czegoś innego niż
ls
. Jeśli wiesz, że został stworzony przez verbatim Ctrl+ C, możesz znaleźć znak ASCII utworzony przy użyciu tabeli znaków kontrolnych lub z bardziej przyjaznym interfejsem, takim jak ten zapewniany przez Python:Inną opcją byłoby przyjrzenie się zrzutowi szesnastkowemu wyniku
ls
, używając nphexdump
.Następnie możesz usunąć plik za pomocą (na przykład) tego polecenia bash:
(Podwójne cudzysłowy są potrzebne tylko wtedy, gdy znak, który próbujesz wydrukować, znajduje się w
IFS
zmiennej, takiej jak\x20
lub\x0A
, ale dobrym zwyczajem jest cytowanie podstawień poleceń, chyba że wiesz, że chcesz, aby powłoka wykonywała podział pola itp.)źródło
cat -v
(plusman ascii
) może pomóc w pierwszej części.os.rmdir('\x03')
bezpośrednio z powłoki Python.Często w tego rodzaju sytuacjach łatwo jest znaleźć wzór wieloznaczny pasujący do odpowiedniego pliku.
W twoim przypadku byłoby to po prostu
?
(dopasowanie wszystkich nazw plików z dokładnie jednym znakiem).Po prostu sprawdź, czy naprawdę pasuje do tego, co chcesz:
A następnie usuń katalog:
Możesz także połączyć to z uzupełnianiem tabulatorów . Możesz pisać
i naciśnij tab, i np. w bash zostanie zastąpiony przez
a następnie możesz nacisnąć Enter i robi to, co chcesz.
źródło
Możesz użyć Midnight Commander (mc), aby usunąć plik - po prostu wybierz za pomocą przycisków góra / dół i naciśnij F8.
Robiłem to czasami, gdy nazwy plików miały dziwne znaki z powodu kodowania.
źródło
Jeszcze inny sposób: użyj,
stat
aby uzyskać ucieczkową reprezentację nazwy katalogu:Teraz znasz reprezentację nazwy pliku, dzięki czemu możesz usunąć plik według nazwy, używając
printf
:Lub, jeśli używasz bash, możesz uniknąć
printf
:źródło
$'\x03'
jest prostsze niż wywołanie printf. To samo dotyczy sh FreeBSD, który jest rozszerzony na powłokę POSIX z kilkoma smakowitymi funkcjami.$'...'
, ale ogólnie unikałbym bezużytecznej konwersji z ósemkowej na szesnastkową. Np. Co jeśli plik zostałby nazwany'\111'
(stat
wyjściowy)? Czy nadal byś go usunął za pomocą$'\x49'
? Lepiej wykorzystywać tę samą sekwencję jakstat
dał ci: w przypadku PO za,rmdir $'\003'
.Rozwiązaniem, które zadziałało dla mnie jest:
cyklicznie przeglądać dostępne pliki, aż znajdę ten, który chcę usunąć.
Ale aby to działało, musisz mieć niezbędne ustawienia w swojej powłoce.
źródło
Najprostszym sposobem jest przeniesienie wszystkiego do katalogu tymczasowego, a następnie
rm -r DIRNAME
.źródło
^v
od wieków działał konsekwentnie.^V
potrzebują konkretnej wiedzy podczas przenoszenia plików, a usunięcie katalogu nadrzędnego można uzyskać z podstaw.Jeśli jest to jedyny pusty katalog (lub nie obchodzi Cię usuwanie innych pustych katalogów), użyj
rmdir */
. Otrzymasz komunikaty o błędach zrmdir
powodu niemożności usunięcia niepustych katalogów, ale to w porządku. GNUrmdir
obsługuje--ignore-fail-on-non-empty
, a ty możesz2>/dev/null
.Końcowe
/
powoduje, że glob pasuje tylko do nazw katalogów.Możesz z góry sprawdzić, które puste katalogi istnieją w bieżącym za pomocą
find -maxdepth 1 -type d -empty -ls
. (I można zmienić-ls
, aby-delete
, jeśli chcesz).Można użyć bardziej szczegółowego wyrażenia glob, na przykład
rmdir [^A-Za-z0-9._]/
do dopasowania katalogów rozpoczynających się od niealfanumerycznej lub podkreślonej nazwy pliku. Uwzględniłem również.
, ale wyrażenia glob i tak nie pasują.
normalnie.Jak zauważyli inni, możesz ograniczyć je do nazw jednoznakowych za pomocą globu
?
:rmdir ?/
rmdir
nie ma takiej-i
opcjirm
, prawdopodobnie dlatego, że puste katalogi zwykle nie są cenne i można je po prostu odtworzyć.źródło
rmdir
możesz powiedzieć, czy podasz-v
opcję (przynajmniej w GNU).find -maxdepth 1 -type d -empty -ls
Zanim zrobisz coś ryzykownego, spróbuj najpierw:
Ogólnie rzecz biorąc - jest separatorem informującym, że polecenie nie będzie wykonywane, ale pozwoli także na interpretowanie dziwnych znaków jako czegoś innego.
Innym przykładem użycia jest
whois -r -- "-r OBJECT-RIPE"
(-r jest skrótem dla dojrzałych, ale u dojrzałych whois również parametr)
Jeśli to nie działa przy pierwszej próbie, może spróbuj
rmdir -- "^C"
Ale w mojej powłoce csh nie potrzebuję jej, po prostu
rmdir ^C
już działa dla mnie.źródło
rmdir
następuje <ctrl> C działa? Naprawdę?! Spodziewałbym się, że zachowa się inaczej, a mianowicie przerwiermdir
polecenie i powróci do linii poleceń.