Excluindo um diretório UNIX com um hífen no nome

13

Através de uma manobra da minha parte, acidentalmente criei um diretório chamado (por exemplo) -A e acabei preenchendo-o com arquivos.

Eu quero excluir o referido diretório. Eu tentei:

rmdir -- -A

mas ele me diz que o diretório ainda possui arquivos. E não consigo descobrir como fazer um cd no diretório para excluir os arquivos mencionados.

O que devo fazer para me livrar desse diretório problemático?

Kate Bertelsen
fonte
5
Felizmente, o diretório não foi chamado de '-rf *'.
user1686
O mesmo no stackoverflow e no unix .
Dorian

Respostas:

29

Use - em todos os comandos.

$ 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 ..
Moo
fonte
11

Você pode colocar ./ ​​na frente do arquivo - dessa forma, rm ou rmdir não se comportará como se o nome do arquivo fosse um sinalizador de opção.

Você também pode emitir a opção - que instrui a rm a agir como se tudo após a - for um nome de arquivo e que não deverá processar mais opções. Pode haver versões funk mais antigas da rm que não obedeçam a isso, embora meu zoológico de unix de antiguidades tenha ficado bem pequeno nos dias de hoje, então não posso lhe dizer quais ou se existem versões que não entendem -.

Você deve ter o hábito de colocar o ./ na frente dos nomes quando estiver excluindo de qualquer maneira - você nunca sabe se existe um arquivo nomeado -r ou -rf no seu diretório. Você poderia dizer que sempre deve usar o - mas acho que o ./ é mais natural porque torna explícito que "eu quero excluir arquivos deste diretório, não o que quer que * aconteça"

chris
fonte
4

Renomeie-o e lide com ele normalmente:

$ mv -- -A foo
$ find foo
$ rm -rf foo
David Mackintosh
fonte
2

O rmdir não excluirá um diretório com nada dentro dele. "rm -rf" será. rmdir é consideravelmente mais seguro que "rm -rf". A resposta de Moo ainda é provavelmente a melhor.

David Pashley
fonte
1
rm -fr ./-A

O comando acima funciona para mim.

q0987
fonte
0

Um método diferente seria excluir por inode (isso funciona para arquivos / diretórios com outros caracteres que são difíceis de excluir com apenas 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
fonte
a rm ainda receberá um argumento -A na linha de comando e ainda tentará interpretá-la como uma opção; portanto, você ainda precisará impedir que ela veja o traço principal de alguma forma (através de traços duplos ou colocando ./ na frente do resto do nome.
chris
A descoberta o anexará automaticamente, já que você encontra em '.'. O nome do arquivo transmitido será './-A' ou qualquer que seja o nome do arquivo, acrescentado com ./ e escapado adequadamente para o comando.
28909 baumgart
Nit: -execnão escapa ao nome e não precisa; o argumento passado por um dos exec*syscalls é o nome real. É apenas a entrada do shell que precisa de caracteres especiais, como asterisco de ponto-e-vírgula, etc., citados para fazer com que o shell passe o nome real correto (SEM aspas). Dito isto, find -exec rm -f {}funciona apenas para um arquivo, não para um diretório, conforme solicitado para este Q; find -exec rm -rf {}lida com o diretório e até com o diretório não vazio, mas pular finde apenas fazer rm -rf ./-Aé muito mais simples.
Dave_thompson_085 17/09/19
0

O find pode excluir o diretório desta maneira:

find . -type d -iname '-A' -delete
ThorstenS
fonte
-1

Eu estava tentando excluir um diretório chamado -p . A resposta do @ Moo alcançou o que não pude rm ./-p, que está amplamente disponível em muitas páginas da web após uma pesquisa no Google.

Outro método é usar o número do inode. Eu usei o método descrito aqui:

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

Em resumo, use os seguintes comandos:

  1. Para exibir o número do inode do arquivo ou diretório.
ls -il
  1. Use o findcomando usando o -exec rm -irfargumento para um arquivo ou -exec rm -ifdrdiretório.
find . -inum <inode-number> -exec rm -irf {} \;
find . -inum <inode-number> -exec rm -irdf {} \;

Certifique-se de usar o -fdentro da flag, caso contrário o bash irá reclamar por não conseguir encontrar o diretório ou arquivo.

Testado em:

Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial
Andres Salgado
fonte
1
Isso é quase duplicado da resposta de baumgart de 10 anos atrás, mas você não precisa nem rm -dsempre e -fquando invoca find, mas precisa -rde um diretório e não precisa de um arquivo. Mesmo quando corrigido, esse método ainda é desajeitado e inferior. Para um diretório não vazio, basta fazer rm -fr ./-p- é r para um diretório ef, dependendo das configurações de permissão.
Dave_thompson_085 17/09/19
1
Ambos os métodos já foram mencionados nas respostas anteriores.
RalfFriedl 17/09/19