Não é possível excluir um arquivo usando o shell cygwin

1

Estou tentando excluir o arquivo ~$bgka.mod do meu diretório atual no shell do Cygwin. Quando listo todos os meus arquivos nesse diretório, aparece:

$ ls
~$bgka.mod   CaBK.mod     hcdist.hoc    mcdist.hoc      pbc.hoc
500net       ccanl.mod    hcell.bcell   mcell.bcell     pgc.hoc
50knet.hoc   gcdist.hoc   hcell.gcell   mcell.gcell     phc.hoc
bcdist.hoc   gcell.bcell  hcell.hcell   mcell.hcell     pmc.hoc
bcell.bcell  gcell.gcell  hcell.mcell   mcell.mcell     ppsyn.mod
bcell.gcell  gcell.hcell  hyperde3.mod  mod_func.c      README.html
bcell.hcell  gcell.mcell  ichan2.mod    mosinit.hoc     run50knet.bash
bcell.mcell  Gfluct2.mod  inhsyn.mod    nca.mod         screenshot.jpg
bgka.mod     gskch.mod    LcaMig.mod    parameters.dat  tca.mod

quando tento rm ~$bgka.mod , recebo o seguinte erro:

$ rm ~$bgka.mod
rm: cannot remove ‘~.mod’: No such file or directory

Além disso, tentei excluir o arquivo do Windows Explorer e do Windows cmd.exe , mas ele não aparece em nenhuma dessas janelas.

Como posso deletar?

    
por kfolw 18.02.2015 / 22:58

3 respostas

2

Estou tentando excluir o arquivo ~ $ bgka.mod do meu diretório atual

~ e $ são caracteres especiais no bash.

Você pode escapar usando \ ou colocar o argumento entre aspas simples ' .

Aspas duplas não podem ser usadas como "Incluindo caracteres entre aspas duplas " preserva o valor literal de todos os caracteres entre aspas, com exceção de $ , 'e \"

Uso:

rm \~\$bgka.mod

Ou:

rm '~$bgka.mod'

Expansão de til

If a word begins with an unquoted tilde character ~, all of the characters up to the first unquoted slash (or all characters, if there is no unquoted slash) are considered a tilde-prefix. If none of the characters in the tilde-prefix are quoted, the characters in the tilde-prefix following the tilde are treated as a possible login name. If this login name is the null string, the tilde is replaced with the value of the HOME shell variable. If HOME is unset, the home directory of the user executing the shell is substituted instead. Otherwise, the tilde-prefix is replaced with the home directory associated with the specified login name.

Fonte Expansão da Shell

Expansão do Parâmetro da Shell

The $ character introduces parameter expansion, command substitution, or arithmetic expansion. The parameter name or symbol to be expanded may be enclosed in braces, which are optional but serve to protect the variable to be expanded from characters immediately following it which could be interpreted as part of the name.

Fonte Expansão da Shell

Citação

Quoting is used to remove the special meaning of certain characters or words to the shell. Quoting can be used to disable special treatment for special characters, to prevent reserved words from being recognized as such, and to prevent parameter expansion.

Each of the shell metacharacters has special meaning to the shell and must be quoted if it is to represent itself.

Escape Character

A non-quoted backslash \ is the Bash escape character. It preserves the literal value of the next character that follows, with the exception of newline. If a \newline pair appears, and the backslash itself is not quoted, the \newline is treated as a line continuation (that is, it is removed from the input stream and effectively ignored).

Single Quotes

Enclosing characters in single quotes ' preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash.

Double Quotes

Enclosing characters in double quotes " preserves the literal value of all characters within the quotes, with the exception of $, ', and \. The characters $ and ' retain their special meaning within double quotes. The backslash retains its special meaning only when followed by one of the following characters: $, ', ", \, or newline. Within double quotes, backslashes that are followed by one of these characters are removed. Backslashes preceding characters without a special meaning are left unmodified. A double quote may be quoted within double quotes by preceding it with a backslash.

Fonte Citações :

Leitura Adicional

por 18.02.2015 / 23:22
2

Você precisa citar o nome do arquivo:

rm '~$bgka.mod'

Discussão

Sem aspas, o shell pensa que $bgka é uma variável shell e substitui em seu valor atual. Como bgka não foi atribuído a nada, ele substitui a string vazia. Como resultado, o shell tenta excluir o arquivo chamado ~.mod . Esse arquivo não existe. É por isso que você recebe o erro:

rm: cannot remove ‘~.mod’: No such file or directory

Colocar o nome do arquivo entre aspas simples resolve isso porque ele diz ao shell para não fazer nenhuma substituição.

Você pode ver a diferença entre aspas simples e sem aspas usando uma simples declaração echo :

$ echo ~$bgka.mod '~$bgka.mod'
~.mod ~$bgka.mod
    
por 18.02.2015 / 23:07
1

As respostas acima são muito detalhadas e corretas. Um truque útil para lidar com nomes de arquivos contendo caracteres especiais é o comando 'find'.

find -name "*bgka*" -exec rm {} \;

Se você puder encontrar um padrão para combinar na parte do nome, esta é a maneira mais fácil de manipular arquivos contendo caracteres especiais.

    
por 18.02.2015 / 23:29