Como remover uma pasta que começa com “$”? [duplicado]

10

Eu criei um diretório chamado "$ pattern" e agora, quando eu tento removê-lo, ele diz

pattern: Undefined variable.

Eu tentei:

$ rm -r $pattern
$ rm -rf $pattern
$ rm "$ option[value='2016']"
    
por Vipanchi Reddy Katthula 02.11.2016 / 13:15

5 respostas

19

$ , espaço, ' e [ são caracteres especiais na maioria dos shells. Para remover seu significado especial, você precisa usar os mecanismos de cotação do shell.

A sintaxe de cotação varia muito com o shell .

Em todos os shells que eu conheço, você pode usar aspas simples para citar todos os caracteres, mas aspas simples, barra invertida e nova linha (em shells como Bourne, ele cita os dois últimos também, exceto em backticks para \ em alguns).

rm -r '$pattern'

Deve funcionar nas camadas mais comuns.

rm -r \$pattern

Funcionaria (exceto dentro de backticks para aqueles semelhantes a Bourne) em todos os shells, exceto os da família rc .

O mesmo que:

rm "\$option[value='2016']"

Em rc , como os shells, você usaria:

rm '$option[value=''2016'']'
    
por 02.11.2016 / 13:47
16

Se o diretório estiver vazio:

rmdir \$pattern

Caso contrário:

rm -r \$pattern

(Exclua recursivamente qualquer arquivo que a pasta contenha)

    
por 02.11.2016 / 13:18
3

Quando você precisa operar em um arquivo que contenha caracteres especiais, uma opção é usar o recurso bash autocomplete: comece digitando seu comando (neste caso rmdir ) e então pressione Tab vários vezes. Isso irá percorrer todos os arquivos / diretório no diretório atual, escapando automaticamente de todos os caracteres especiais.

Isso também funciona bem se você estiver operando em nomes de arquivos muito longos.

    
por 02.11.2016 / 13:24
0

Se tudo mais falhar, você poderá excluir o arquivo com base no número do inode. Primeiro liste todos os arquivos no diretório atual com os números de inode

ls-il

usando o primeiro número da impressão para o nome do arquivo correspondente, você pode usar o seguinte comando para excluir com base no número do inode

find . -inum [inode-number] -exec rm -i {} \;

Exemplo

$ ls -il
total 0
804743 -rw-r--r--  1 staff  0 Nov  2 19:49 test1
804744 -rw-r--r--  1 staff  0 Nov  2 19:49 test2

$ find . -inum 804743 -exec rm -i {} \;
remove ./test1? y

$ ls -il
total 0
804744 -rw-r--r--  1  staff  0 Nov  2 19:49 test2
    
por 03.11.2016 / 00:53
0

Você simplesmente escapa do caractere usando um "\", esta também é uma prática comum usada para escrever consultas SQL em aplicações web para prevenir a execução de comandos do banco de dados diferentes dos pretendidos.

    
por 03.11.2016 / 01:01