Excluindo arquivos com espaços em seus nomes

8

Estou tentando excluir todos os arquivos com um espaço em seus nomes. Eu estou usando o seguinte comando. Mas está me dando um erro

Comando: ls | egrep '. ' | xargs rm

Aqui, se eu estiver usando apenas o comando ls | egrep '. ' , ele estará me fornecendo todo o nome do arquivo com espaços nos nomes dos arquivos. Mas quando estou tentando passar a saída para rm, todos os espaços (inicial ou final) são excluídos. Então meu comando não está sendo executado corretamente.

Quaisquer ponteiros sobre como excluir o arquivo tendo pelo menos um espaço em seu nome?

    
por Anuj 07.06.2015 / 23:38

6 respostas

28

Você pode usar apenas globbing padrão no comando rm :

rm -- *\ *

Isso excluirá qualquer arquivo cujo nome contenha um espaço; o espaço é escapado, então o shell não o interpreta como um separador. Adicionar -- evitará problemas com nomes de arquivos que começam com traços (eles não serão interpretados como argumentos por rm ).

Se você quiser confirmar cada arquivo antes de excluí-lo, adicione a opção -i :

rm -i -- *\ *
    
por 07.06.2015 / 23:41
12

Eu evitaria analisar ls output

Por que não:

find . -type f -name '* *' -delete

Não há problema com rm : -).

Embora isso seja recursivo e excluirá todos os arquivos com espaço no diretório atual e nos diretórios aninhados, conforme mencionado nos comentários.

    
por 08.06.2015 / 02:45
7

Veja isso Suponha que o nome "arquivo estranho"

Solução 1

rm strange\ file

solução dois

rm "strange file"

solução três

ls -i "strange file"

você vê o inode então

find . -inum "numberoofinode" -exec rm {} \;

No caso de nomes de arquivos muito estranhos, como

!-filename or --filename

use

rm ./'!-filename'
    
por 07.06.2015 / 23:55
3

De man xargs

xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines, and executes the command (default is /bin/echo) one or more times with any initial-arguments followed by items read from standard input. Blank lines on the standard input are ignored.

Podemos (principalmente) corrigir seu comando inicial alterando o delimitador xargs para uma nova linha:

ls | egrep '. ' | xargs -d '\n' rm (não faça isso ... continue lendo)

Mas e se o nome do arquivo contiver uma nova linha?

touch "filename with blanks and newline"

Because Unix filenames can contain blanks and newlines, this default behaviour is often problematic; filenames containing blanks and/or newlines are incorrectly processed by xargs. In these situations it is better to use the -0 option, which prevents such problems.

ls é realmente uma ferramenta para consumo direto por um ser humano , em vez disso, precisamos usar o comando find , que pode separar os nomes dos arquivos com um caractere nulo ( -print0 ). Nós também precisamos dizer ao grep para usar caracteres nulos para separar a entrada ( -z ) e a saída ( -Z ). Finalmente, dizemos ao xargs que também use caracteres nulos ( -0 )

find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm

    
por 08.06.2015 / 09:53
1

Você pode usar:

find . -name '* *' -delete
    
por 08.06.2015 / 07:58
-1

Para fazer isso, você precisará da opção -Z do grep e da opção -0 do xargs. Mas eu não faria assim ( ls não é a ferramenta certa para o trabalho, há muitos problemas em fazer o computador ler sua saída).

Veja outras respostas para uma maneira melhor.

ls | … é equivalente a ls -d * e echo * | …

Todos os que têm problemas. Portanto, não use ls assim, use uma solução de outra resposta.

    
por 12.11.2018 / 12:11