Exclua arquivos com nomes que aparecem para começar com '?' na linha de comando

7

Eu estou rodando sob o Debian estável, Cinnamon DE e tenho alguns arquivos que eu gostaria de deletar com uma linha de comando (por enquanto eu apago esses arquivos com o Nemo).

Por exemplo, esses arquivos .txt começam com '?' no shell e no Nemo isso '?' é substituído por um retorno de carro:

$@debian: ls
ssolveIncpUL46pK  ?ssolveIncpUL46pK.txt

Eu tentei:

 rm ?ss*
 rm \?ss*
 rm \ ss*
    
por Smilia 21.08.2018 / 18:32

3 respostas

17

O personagem não é um ponto de interrogação. O utilitário ls substituirá os caracteres não imprimíveis por ? . Também não está claro se o caractere não imprimível é realmente o caractere primeiro no nome do arquivo ou se pode haver um ou vários espaços antes disso.

Você gostaria de excluir ambos os arquivos, você poderia combinar a "parte ruim" com * e, em seguida, especificar o resto do nome do arquivo visível mais de perto:

rm -i ./*ssolve*

Isso primeiro expandiria o padrão fornecido para todos os nomes de arquivos correspondentes e, em seguida, rm os removeria. Seja mais específico e especifique uma parte mais longa do nome do arquivo se houver arquivos que você não queira excluir que correspondam ao padrão curto acima, por exemplo, com

rm -i ./*ssolveIncpUL46pK*

Isso supõe que você esteja no mesmo diretório dos arquivos que deseja excluir.

A opção -i para rm solicita a confirmação antes de excluir qualquer coisa.

    
por 21.08.2018 / 18:39
26

A maneira apropriada de remover esse tipo de arquivo é usando o valor inode do arquivo.

Use o seguinte comando para obter inode value

 ls -li 

 12582925 -rw-r--r--  1 root root   646 May 23 02:19 ?ssolveIncpUL46pK.txt

O primeiro campo do resultado de longa lista é o valor de inode.

Em seguida, use o comando find para excluir o arquivo w.r.t inode.

find . -inum 12582925 -exec rm -i {} \;
    
por 21.08.2018 / 18:54
12

Não é recomendado usar um * para remover arquivos. Poderia corresponder mais do que você gosta.

Estando no Debian, o comando ls (do GNU) é capaz de imprimir os valores dos arquivos no formato citado [ 1 ] :

$ ls -Q
"\nssolve"  "\n\nssolve"  "y"  "z"

Ou, melhor ainda, listar arquivos com nomes e inodes citados:

$ ls -iQ
26738692 "\nssolve"  26738737 "\n\nssolve"  26738785 "y"  26738786 "z" 

Em seguida, use rm com o número do inode para garantir que apenas os arquivos corretos sejam removidos:

$ find . -xdev -inum 26738737 -exec rm -i {} \;

A chamada para encontrar é limitada a um sistema de arquivos ( -xdev ) para evitar a correspondência de um arquivo em outro sistema de arquivos com o mesmo número de inode. Note também que rm está sendo chamado com a opção -i (interactive), então ele perguntará na linha de comando se cada arquivo deve ser apagado.

[ 1 ] Observe que isso não resolve o problema com caracteres visualmente confusos como um cirílico а ($ '\ U430') e um latim a ($ '\ U61') que parecem exatamente iguais, mas não são. Para ter uma visão melhor dos bytes que um nome de arquivo está usando, precisamos usar um visualizador hexadecimal;

$ touch а a é $'e\U301' $'\U301'e
$ ls
a  ́e  é  é  а              # what you "see" here depends on your system.

$ printf '<%s>' * | od -An -c
   <   a   >   < 314 201   e   >   <   e 314 201   >   < 303 251
   >   < 320 260   >
    
por 21.08.2018 / 20:12