Usando 'sem' para fazer um script rodar em paralelo

1

Eu tenho o seguinte shell script (um liner), que eu queria usar para identificar diretórios que possuem exatamente o mesmo conteúdo. Estou usando, para identificar e remover diretórios duplicados (filhos).

Quando tento executar o mesmo script com sem , encontro No such file or directory erros.

Exemplo - sem threads paralelas

find -type d -links 2 | while read i; do \
   find "$i" -type f -print0 | xargs -r0 md5sum | awk '{ print $1 }' \
   | sort | md5sum | xargs -I {} echo {} $i ; \
   done

Me dá:

e94d32e2a683d46d49c7580d649f7888  - ./Daft Punk/Alive 2007 2
e94d32e2a683d46d49c7580d649f7888  - ./Daft Punk/Alive 2007

Exemplo - usando sem

find -type d -links 2 | while read i; do sem -j+0 \
   find "$i" -type f -print0 | xargs -r0 md5sum | awk '{ print $1 }' \
   | sort | md5sum | xargs -I {} echo {} $i ; \
   done; sem --wait

Me dá:

find: './Daft': No such file or directory
find: 'Punk/Alive': No such file or directory
find: '2007': No such file or directory
find: '2': No such file or directory
d41d8cd98f00b204e9800998ecf8427e  - ./Daft Punk/Alive 2007 2
find: './Daft': No such file or directory
find: 'Punk/Alive': No such file or directory
find: '2007': No such file or directory
d41d8cd98f00b204e9800998ecf8427e  - ./Daft Punk/Alive 2007

Perguntas:

  1. Por que a diferença de comportamento?
  2. Como faço para remover / corrigir o No such file or directory do script sem ?
  3. Existem outras melhorias que eu poderia fazer no script? (há muitos awk e xargs )
por Nick Grealy 19.06.2016 / 05:04

2 respostas

2

A solução mais simples é citar o comando passado para sem:

sem -j+0 "find \"$i\" -type f -print0"

Você pode ver a diferença neste exemplo

$ sem -j 8 echo "a  a" 
a a
$ sem -j 8 'echo "a  a"' 
a  a
    
por 19.06.2016 / 09:30
1

Use paralelo em vez disso:

doit() {
  i="$1"
  find "$i" -type f -print0 | xargs -r0 cat | md5sum |
    awk '{ print $1 }' |
    sort | md5sum
}
export -f doit
find -type d -links 2 | parallel --tag doit
    
por 19.06.2016 / 17:56