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
find
para 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/FileName
do 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
echo
na frente do comando críticoln
para 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.