Bash: Use a opção exec find classificando dois argumentos de arquivo

4

Digamos que eu queira comparar os arquivos com o mesmo nome de arquivo entre esses dois diretórios:

 /tmp/datadir/dir1/dir2/

e

 /datadir/dir1/dir2/

É necessário classificá-los antes de comparar.

Atualmente, estou no diretório /tmp e tentei executar este find com a opção exec :

find datadir -type f -exec sdiff -s <( sort {} ) <( sort "/"{} ) \;

Mas, isso me dá um erro

sort: open failed: {}: No such file or directory

sort: open failed: /{}: No such file or directory

No entanto, o comando abaixo funciona bem, mas os dados não são classificados para uma comparação adequada.

find data -type f -exec sdiff -s  {}  "/"{} \;

Como posso resolver este problema?

    
por Kaushik Nayak 07.08.2018 / 16:01

2 respostas

10

A substituição de {} é feita por find e acontece após a avaliação da substituição do processo ( <(…) ) e tal em seu código.

Usando bash -c :

find datadir -type f -exec \
  bash -c 'sdiff -s <( sort "$1" ) <( sort "/$1" )' bash {} \;

Ou para evitar a execução de uma bash instância por arquivo:

find datadir -type f -exec bash -c '
  for file do
    sdiff -s <( sort "$file" ) <( sort "/$file" )
  done' bash {} +
    
por 07.08.2018 / 16:06
1

Você pode considerar usar a opção -r (recursiva) que faz toda a classificação e recursão para você.

    
por 07.08.2018 / 19:42

Tags