Usuwanie katalogu UNIX z myślnikiem w nazwie

13

Dzięki manewrowi z kością przypadkowo utworzyłem katalog o nazwie (na przykład) -A i ostatecznie wypełniłem go plikami.

Chcę usunąć wspomniany katalog. Próbowałem:

rmdir -- -A

ale wtedy mówi mi, że w katalogu nadal są pliki. I nie mogę wymyślić, jak wprowadzić cd do katalogu, aby usunąć te pliki.

Co powinienem zrobić, aby pozbyć się tego kłopotliwego katalogu?

Kate Bertelsen
źródło
5
Na szczęście katalog nie został nazwany „-rf *”.
user1686,
To samo dotyczy stackoverflow i unix .
Dorian

Odpowiedzi:

29

Użyj - na każdym poleceniu.

$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ mkdir -- -A
$ ls -la
total 36
drwxr-xr-x  2 richard  richard  512 Jul 28 15:44 -A
drwxr-xr-x  4 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
$ cd -- -A
$ ls
$ pwd
/home/richard/-A
$ cd ..
$ rm -rf -- -A
$ ls -la
total 32
drwxr-xr-x  3 richard  richard  512 Jul 28 15:44 .
drwxr-xr-x  3 root     wheel    512 Jul  6 17:10 ..
Muczeć
źródło
11

Możesz umieścić ./ przed plikiem - w ten sposób rm lub rmdir nie będą zachowywać się tak, jakby nazwa pliku była flagą opcji.

Możesz także wydać opcję - która każe rm zachowywać się tak, jakby wszystko po nim - była nazwą pliku i że nie powinna przetwarzać więcej opcji. Mogą istnieć funky starsze wersje rm, które tego nie przestrzegają, chociaż moje zoo starych uniksów stało się dość małe, więc nie mogę ci powiedzieć, które z nich lub czy są wersje, które nie rozumieją -.

Powinieneś przyzwyczaić się do umieszczania ./ przed nazwami, gdy i tak usuwasz - nigdy nie wiesz, czy w katalogu znajduje się plik o nazwie -r lub -rf. Możesz powiedzieć, że zawsze powinieneś używać - ale uważam, że ./ jest bardziej naturalny, ponieważ wyraźnie stwierdza, że ​​„chcę usunąć pliki z tego katalogu, a nie cokolwiek * się dzieje z globem”

Chris
źródło
4

Zmień nazwę, a następnie postępuj normalnie:

$ mv -- -A foo
$ find foo
$ rm -rf foo
David Mackintosh
źródło
2

rmdir nie usunie katalogu z niczym w nim zawartym. „rm -rf” będzie. rmdir jest znacznie bezpieczniejszy niż „rm -rf”. Odpowiedź Moo jest prawdopodobnie najlepsza.

David Pashley
źródło
1
rm -fr ./-A

Powyższe polecenie działa dla mnie.

q0987
źródło
0

Inną metodą byłoby usunięcie za pomocą i-węzła (działa to w przypadku plików / katalogów z innymi znakami, które trudno usunąć za pomocą samego rm).

bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
5172770 make_hosts.pl
bash-3.2$ find . -inum 5172770 -exec rm -f {} \;
bash-3.2$ ls -i
4905937 angry-1.gif
5174052 hermes
bash-3.2$
baumgart
źródło
rm nadal otrzyma argument -A w wierszu poleceń i nadal będzie próbował interpretować go jako opcję, więc nadal musisz uniemożliwić jakoś zobaczenie wiodącego myślnika (poprzez podwójne myślniki lub przez umieszczenie ./ przed znakiem reszta imienia
Chris
Znalezienie poprzedzi to automatycznie, ponieważ znajdujesz od „.”. Podawana nazwa pliku to „./-A” lub jakikolwiek inny plik, który można wywołać, poprzedzony ./ i poprawnie uciekł dla polecenia.
baumgart
Nit: -execnie ucieka od nazwy i nie musi; argument przekazany przez jedno z exec*syscalli jest faktyczną nazwą. Jedynie dane wejściowe powłoki wymagają specjalnych znaków, takich jak gwiazdka średnika spacji itp., Aby uzyskać od powłoki prawidłową (BEZ cudzysłowów) rzeczywistą nazwę. To powiedziawszy, find -exec rm -f {}działa tylko dla pliku, a nie dla katalogu wymaganego dla tego Q; find -exec rm -rf {}obsługuje katalog, a nawet katalog niepusty, ale pomijanie findi wykonywanie rm -rf ./-Ajest znacznie prostsze.
dave_thompson_085,
0

find może usunąć katalog w ten sposób:

find . -type d -iname '-A' -delete
ThorstenS
źródło
-1

Próbowałem usunąć katalog o nazwie -p. Odpowiedź @ Moo osiągnęła to, czego nie byłem w stanie zrobić rm ./-p, co jest szeroko dostępne na wielu stronach internetowych po wyszukiwaniu w Google.

Inną metodą jest użycie numeru i-węzła. Użyłem opisanej tutaj metody:

https://www.cyberciti.biz/tips/delete-remove-files-with-inode-number.html

Krótko mówiąc, użyj następujących poleceń:

  1. Aby wyświetlić numer i-węzła pliku lub katalogu.
ls -il
  1. Użyj findpolecenia, używając -exec rm -irfargumentu dla pliku lub -exec rm -ifdrkatalogu.
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

Upewnij się, że używasz -fflagi wewnątrz, w przeciwnym razie bash narzeka na brak możliwości znalezienia katalogu lub pliku.

Testowane na:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial
Andres Salgado
źródło
1
Jest to prawie duplikat odpowiedzi Baumgart sprzed 10 lat, ale nie potrzebujesz rm -dnigdy i zwykle nie -fprzy wywoływaniu find, ale potrzebujesz -rkatalogu i nie potrzebujesz go do pliku. Nawet po skorygowaniu ta metoda jest nadal niezdarna i gorsza. W przypadku niepustego katalogu wystarczy zrobić rm -fr ./-p- to r dla katalogu if w zależności od ustawień uprawnień.
dave_thompson_085,
1
Obie metody zostały już wspomniane w poprzednich odpowiedziach.
RalfFriedl