- conversão de exec para xargs no comando find
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
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.
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.