Excluindo todos os arquivos que começam com parênteses

1

Eu tenho muitos arquivos em um diretório que começa com parênteses. Eles são gerados pelo Dropbox devido a conflitos. Qualquer combinação de escape não parece ajudar:

rm -rf "(*"
rm -rf "\(*"
rm -rf \(*

Como Frostschutz mencionou, eles não parecem ser caracteres ASCII. Como posso saber se esse é o caso e qual é o trabalho?

    
por Forethinker 30.10.2013 / 18:18

5 respostas

5

O shell interpreta a linha de comando com certas regras que você deve considerar aqui:

  • Você pode escapar de metacaracteres de shell com \ para que se comporte como um caractere comum.

  • Você pode usar aspas simples ou duplas e, dentro dessas (com aspas duplas) ou todas (com aspas simples), os metacaracteres do shell perdem seu significado especial.

  • As cotações não precisam estar em limites de palavras, de forma que rm th"is fil"e seria o mesmo que rm "this file" .

  • Os caracteres []? * podem ser usados para expansão de nome de arquivo. Eles não podem ser citados ou escaparam para este propósito.

Assim, as soluções possíveis para o seu caso são rm -rf '('* , rm -rf "("* e rm -rf \(* . Eu não sei porque o último não funcionou no seu caso. Talvez haja algum espaço em branco na frente dos parênteses?

Com a seguinte linha, você poderá ver se há algum caractere engraçado em seus nomes de arquivo:

for i in *; do od -c <<< "$i"; done
    
por 30.10.2013 / 18:43
1

Se você colocar * dentro de " ou ' , ele não será expandido (é um literal * apenas).

Mas você pode colocar o * fora de " :

rm "("*

No entanto, isso é idêntico ao rm \(* que você já postou. Portanto, se isso não funcionar, seus arquivos não começarão com o caractere ASCII ( , afinal de contas (há caracteres Unicode que parecem muito semelhantes) ou você está tentando isso no local errado.

    
por 30.10.2013 / 18:27
0

Duas coisas que você pode tentar:

1) rm -f \(*

(Você não precisa de -r , a menos que queira excluir diretórios de forma recursiva. Como você disse "arquivos", deixei-o desativado. rm -rf é uma ferramenta perigosa e não deve ser usada se não for necessária .)

2) rm -i *

Esse método requer um pouco de intervenção manual, mas como os caracteres não alfanuméricos tendem a ser classificados primeiro, as coisas que você deseja excluir tendem a aparecer primeiro e você pode emitir um ^C quando as tiver obtido. / p>

Como observação, ao experimentar curingas ímpares, tente usar echo no lugar de rm primeiro. Especialmente se usar rm -rf . Dessa forma, você pode ver o que o shell acha que ele expande (se houver) antes de excluir as coisas. Especialmente porque, às vezes, esse tipo de arquivo é criado por alguém esperando que você faça algo bobo e remova mais arquivos do que você pretende.

    
por 30.10.2013 / 18:25
0

Como outros já mencionaram, o terceiro exemplo que você incluiu deveria ter funcionado. Como alternativa, você pode usar find para excluir esses arquivos também.

Exemplo

Assumindo os seguintes dados de amostra.

$ touch "(afile)"{1..5}
$ ls -l
total 0
-rw-rw-r-- 1 saml saml 0 Oct 30 13:47 (afile)1
-rw-rw-r-- 1 saml saml 0 Oct 30 13:47 (afile)2
-rw-rw-r-- 1 saml saml 0 Oct 30 13:47 (afile)3
-rw-rw-r-- 1 saml saml 0 Oct 30 13:47 (afile)4
-rw-rw-r-- 1 saml saml 0 Oct 30 13:47 (afile)5

Agora delete os arquivos usando find (supondo que você tenha uma versão GNU de find ):

$ find . -name "(*" -delete
$ ls -l
total 0
$
    
por 30.10.2013 / 18:48
0

Em uma situação em que só preciso limpar esses arquivos uma vez, basta listá-los em um arquivo:

$ ls -1 > delete-list

Em seguida, edite manualmente delete-list , para que contenha apenas os nomes dos arquivos que desejo remover. Finalmente:

$ xargs --delim=\n rm < delete-list

Se os nomes forem bem comportados em relação aos espaços em branco, você poderá descartar a opção --delim paranóica.

    
por 30.10.2013 / 21:07