Como deletar ou acessar um arquivo com uma barra invertida \ em seu nome?

3

Eu tenho alguns arquivos aqui que eu copiei para esta caixa linux usando o módulo Python pysftp:

[jm@spartan tf]$ ls -la
total 0
drwxrwxrwx. 3 jm jm  69 Aug 14 13:50 .
drwxrwxrwt. 9 root    root    238 Aug 14 13:49 ..
-rwxrwxrwx. 1 jm jm   0 Aug 14 13:49 .\gitkeep
drwxrwxrwx. 2 jm jm   6 Aug 14 13:50 .\innerfile
-rwxrwxrwx. 1 jm jm   0 Aug 14 13:50 .\innerfile\gitkeep
[jm@spartan tf]$ rm .\gitkeep
rm: cannot remove ‘.gitkeep’: No such file or directory

Eles estão ocultos, então eu ainda estou tentando descobrir como copiar depois para que eles não fiquem ocultos, mas enquanto isso eu quero apagá-los, mas não consigo. O que está acontecendo aqui?

Estou no CentOS 7.

    
por Legit Stack 14.08.2018 / 21:58

2 respostas

5

O que você realmente precisa fazer é consertar seu script para que ele converta os caminhos do Windows em caminhos Unix. Uma maneira relativamente fácil de fazer isso é tirar os separadores de caminho da equação: em vez de fornecer nomes de caminho completos para copiar, você percorre diretórios de maneira recursiva, criando diretórios de destino no lado remoto e especificando apenas o nome do arquivo em vez do caminho completo. :)

Mas até chegar a esse ponto, você precisa proteger as barras invertidas do shell. Você pode fazer isso citando usando aspas simples (as barras invertidas são interpretadas para alguns caracteres entre aspas duplas). Observe especificamente que o caractere curinga está fora das aspas, portanto, o shell o trata como um caractere curinga, em vez de um literal * ::)

rm -rv '.\'*

Ou você pode fazer isso escapando da barra invertida (o que também funcionaria entre aspas duplas, mas as aspas duplas não são necessárias aqui):

rm -rv .\*

Sugiro que, antes de remover o material usando um caractere curinga, você sempre execute ls com os mesmos argumentos e use a seta para cima para recuperar o último comando, onde é possível alterar o ls para um% código%. Dessa forma, você pode ver a lista de arquivos antes de removê-los, evitando um erro potencialmente grande. :) Eu também sou um grande fã de usar rm com -v em casos como este.

sauer@lightning:/tmp> ls -vr .\*
.\innerfile\gitkeep  .\gitkeep

.\innerfile:
sauer@lightning:/tmp> rm -vr .\*
removed '.\gitkeep'
removed directory '.\innerfile'
removed '.\innerfile\gitkeep'
    
por 14.08.2018 / 23:32
2

Como os nomes dos arquivos contêm um caractere de escape \ , você precisa escapar desse caractere de escape.

rm .\gitkeep .\innerfile\gitkeep
rmdir .\innerfile 

removerá seus arquivos

    
por 14.08.2018 / 22:06