- conversão de exec para xargs no comando find

Aug 24 2020

Estou usando o comando abaixo em meu script para realizar uma dos2unixoperação nos arquivos que copio do Windows para o Linux. Existem muitos arquivos, por isso leva um tempo considerável para executar esta operação.

Eu pesquisei na internet por otimizar este achado e descobri que podemos usar xargscom em findvez de -execpara aumentar o desempenho, mas estou lutando para converter o abaixo para usar com xargs:

find /path_to_files/ -exec bash -c 'dos2unix -k -n "{}" tmp_file && mv tmp_file "{}"' \;

Respostas

1 waltinator Aug 24 2020 at 00:35

Crie um script ~/binpara processar uma lista de arquivos, chame-o doit, contendo

#!/bin/bash
while [[ $# -ne 0 ]] ; do thisfile="$1"
    shift
    dos2unix -k -n "$thisfile" tmp_file mv tmp_file "$thisfile"
done

Então,

chmod +x ~/bin/doit

E finalmente,

find /path/to/files -type f -print0 | \
    xargs -0 -r $HOME/bin/doit

Leia man find xargs bash.

8 Quasímodo Aug 24 2020 at 01:07

Na verdade, é muito mais simples. Você não precisa invocar um shell nem usar mvporque dos2unixjá modifica o arquivo de destino se você não der a ele o -nsinalizador.

find /path_to_files -type f -exec dos2unix -k -q -- {} +

-type fpara que o find procure apenas arquivos regulares, não diretórios. -qo sinalizador é fornecido para dos2unixnão gravar mensagens informativas no stdout. E usamos em {} +vez de {} \;para que find não invoque um dos2unixprocesso para cada arquivo encontrado, em vez disso, dá tantos arquivos quanto pode como argumentos ( dos2unix file1 file2 file3 ...).

Xargs seria apenas um processo extra e, portanto, uma penalidade de tempo extra. Evite invocar novos processos sempre que puder.