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 ls | egrep '. '
comando, ele estará me dando 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 (à esquerda ou à direita) são excluídos. Portanto, meu comando não está sendo executado corretamente.
Alguma dica sobre como excluir o arquivo com pelo menos um espaço em seu nome?
echo
primeiro, para evitar erros de digitação. Adicioneecho
na frente e ele imprimirá todos os arquivos que serão removidos.find
seja poderoso, às vezes você não precisa matar o frango com uma metralhadora. Os administradores do UNIX geralmente não recorrem afind
(por exemplo) "remover todos os arquivos que começam com a letra A" ... um simplesmenterm A*
. Da mesma forma, para remover arquivos que contêm espaços, a rm pode fazer o trabalho. Em outras palavras, não se deixe enganar, porque o espaço é invisível e é tratado especialmente pela concha. Simplesmente escape, como Stephen Kitt fez, e você pode pensar nisso como qualquer outro personagem.Eu evitaria analisar a
ls
saídaPor que não :
Nenhum problema com
rm
:-).Embora isso seja recursivo e exclua todos os arquivos com espaço no diretório atual e nos diretórios aninhados, conforme mencionado nos comentários.
fonte
-name '* *'
vez do regex; e (2) você pode usar-print0 | xargs -0 rm -i
para resolver a preocupação de @ StephenKitt.xargs
. Basta usar-exec rm -i '{}' +
find . -maxdepth 1 -name '* *' -delete
.Veja este nome suponha "arquivo estranho"
Solução um
solução dois
solução três
você vê o inode então
No caso de nomes de arquivos muito estranhos, como
usar
fonte
De
man xargs
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"
ls
é realmente uma ferramenta para consumo direto de um ser humano ; em vez disso, precisamos usar ofind
comando que pode separar os nomes de arquivos com um caractere nulo (-print0
). 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
fonte
Você pode usar:
fonte
Para fazer dessa maneira, você precisará da
-Z
opção grep e da-0
opção xargs. Mas eu não faria dessa maneira (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.
Além disso
ls | …
é equivalente als -d *
eecho * | …
Todos com problemas. Portanto, não use
ls
assim, use uma solução de outra resposta.fonte
ls *
quando os pipes emitem os nomes dos arquivos delimitados por nova linha.echo
(pelo menos algumasecho
implementações) expande seqüências de barra invertida.grep -Z
é para escrever nomes de arquivo delimitados por NUL ao usar-l
, não ajudará aqui. Se você quis dizer-z
, isso também não ajudará, pois a maioria dasls
implementações não possui uma opção para gerar nomes de arquivos delimitados por NUL. Alguém poderia fazer algo como issoprintf '%s\0' * | grep -z ' ' | xargs -r0 rm -f
.