xargs linha muito longa

1

Estou tentando remover todos os arquivos que têm um dígito hexadecimal nos dois primeiros dígitos, por isso estou usando a seguinte expressão:

ls | grep -Z '^[0-9a-f][0-9a-f]' | xargs -0 rm

No entanto, o terminal gera o erro:

xargs: argument line too long

Para verificar novamente, eu corri:

ls | grep -Z '^[0-9a-f][0-9a-f]' 

que gera todos os arquivos que eu quero excluir.

Por que estou recebendo esse erro? Além disso, como posso excluir esses arquivos?

Além disso, os nomes dos meus arquivos são semelhantes aos seguintes:

ffc1abfa3149067e990620dbecfa96d325fbbd
ffcc72282168e33110ecf436e2726a5f901ca6
ffd010299a02ded0a8d41ee1ccc242f2193df2
ffd27295acbe3d35088a5a754f5593eac6a0ae
ffd332a39f7be05d58863fe3bf55d7aba68b69
ffd7ba85b0577b90c0fb1b3922303c486127d4
ffdb37718feaf64c404a6c2a3648f15cdf27b1
ffdbffe5b187c8a73d15da9e5f6cc0fb8d4df3
ffdd8c340650848759c7e59f90f8c112ac33ce
ffde57cb4ba9b69531a3b3f2c6588d2802f71b
ffdeb529353a85b642efa1404aa27e58982da1
ffe0bec99e3e64c61dd45e404c8ccf12d7bea5
ffe58837e9d976499781de17628f2f41e16c9a
ffee6887889924583762e43d5a6b9cd29b6690
fff0b6886aff6cb4073742fbf7bcc1b47d9b45

Talvez os próprios nomes dos arquivos sejam muito longos para xargs ?

    
por modulitos 18.08.2014 / 21:04

4 respostas

6

-Z é a saída de um NUL após cada nome de arquivo com grep -l , para não alterar as novas linhas para NULs nas linhas que ele gera. Portanto, xargs -0 vê apenas um registro enorme (com vários caracteres de nova linha), já que não há delimitado por NUL, sendo apenas um argumento para passar para rm e provavelmente maior que o tamanho máximo de um argumento (128kB no Linux ) e de qualquer forma não existe tal arquivo chamado ...ffd7ba85b0577b90c0fb1b3922303c486127d4<newline>...fff0b6886aff6cb4073742fbf7bcc1b47d9b45 .

Faça simplesmente:

rm [0-9a-f][0-9a-f]*

Ou se a lista for muito grande:

printf '%s
autoload zargs        # best in ~/.zshrc
setopt extendedglob   # ditto

zargs [0-9a-f](#c2)* -- rm
' [0-9a-f][0-9a-f]* | xargs -r0 rm

Ou com zsh :

command -x rm {2}([0-9a-f])*

Ou com ksh93 :

find . ! -name . -prune -name '[0-9a-f][0-9a-f]*' -exec rm {} +

Ou:

rm [0-9a-f][0-9a-f]*

Tenha em atenção que, nas regiões não-C, [a-f] pode corresponder a mais do que [abcdef] .

    
por 18.08.2014 / 21:16
0

Sugiro alterar sua seleção de comandos para algo como:

 find . -name '^[0-9a-f][0-9a-f]' -print0 | xargs -0 rm

ou outra alternativa

 find . -name '^[0-9a-f][0-9a-f]' -exec rm {} \;
    
por 18.08.2014 / 23:36
0

Você estaria melhor usando apenas encontrar. Algo como find -type f -iname '[0-9a-f][0-9a-f]*' -delete deveria fazer isso. tente primeiro com -print em vez de -delete para ter certeza, claro.

    
por 24.04.2015 / 17:23
-1

Você pode estar correndo contra um limite de nome de arquivo, dependendo do seu tipo de sistema de arquivos. Veja:

link

Especificamente, a seção "Limites"

Você pode verificar o tipo de sistema de arquivos se não souber usando:

$ cat /etc/fstab

    
por 18.08.2014 / 21:48

Tags