Agora que você esclareceu sua dúvida, eu posso ver o que você precisa: -
find /Users/Ben/Pictures/ -type d -name Best | \
while read -r d; \
do for f in "$d"/*; \
do cmp "$f" "${f%/Best/*}/${f##*/Best/}" && \
ln -sf "${f%/Best/*}/${f##*/Best/}" "$f"; \
done; \
done
Isso funciona da seguinte maneira: -
- Use
findpara localizar todos os subdiretóriosBest/. - Para cada subdiretório encontrado, compare cada um dos arquivos com o original na pasta pai.
- Se forem idênticos, sobrescreva o arquivo em
Best/com um link para o arquivo na pasta pai. - Se você preferir links simbólicos difíceis, poderá usar
ln -f ...em vez deln -sf ...(ambos serão adequados aos seus propósitos). - Os elementos de análise de chave são
${f%/Best/*}, que remove/Best/FileNamedo final do caminho (deve ser o mesmo que$d) e${f##*/Best/}, que isola o nome do arquivo do caminho (deve ser o mesmo que${f##*/}). - Normalmente, não escrevo scripts completos como respostas, mas não consigo ver uma maneira fácil de orientá-lo durante a redação; Certifique-se de entendê-lo antes de usá-lo - adicione
echona frente do comando críticolnpara ter certeza de que ele fará o que você espera.
Eu testei isso no Ubuntu, mas as implementações do OS / X de cmp e ln devem funcionar com os mesmos parâmetros.
Se você errar, faça um backup dos diretórios antes de começar.