xargs -d "\n" -I {} rm \"{}\"
Isso pressupõe a versão do xargs
do coreutils que suporta a opção -d
para especificar o delimitador.
Isso não funcionará junto com o comando find
porque ele adiciona aspas duplas aos nomes de caminho encontrados por find
. Isso significa que, em vez de ./somedir/file.scala
, a chamada para rm
é feita com o literal pathname "./somedir/file.scala"
.
Exemplo:
$ touch hello
$ touch '"hello"'
$ ls
"hello" hello
$ echo hello | xargs -d "\n" -I {} rm \"{}\"
$ ls
hello
Funciona quando você canaliza os comandos gerados para bash
porque bash
faz a remoção da cotação.
Provavelmente também teria funcionado se você não tivesse feito o esforço extra para adicionar as cotações em primeiro lugar:
xargs -d "\n" -I {} rm {}
Para excluir seus arquivos corretamente, use
find . -type f -name '*.scala' -delete
ou, se você ainda quiser usar xargs
:
find . -type f -name '*.scala' -print0 | xargs -0 rm
que passa os nomes de caminho entre find
e xargs
como uma lista delimitada por nul. Nul (
) é o caractere somente que não é permitido em um nome de caminho em sistemas Unix. Os nomes de arquivos também não podem conter /
rm
, mas novas linhas são permitidas.
Uma terceira opção seria chamar find
diretamente de {}
:
find . -type f -name '*.scala' -exec rm {} +
Note que find
não precisa ser (e não deve ser) citado como %code% sabe perfeitamente como passar nomes de caminho com espaços (ou novas linhas ou qualquer que seja) para o utilitário nomeado.