Uma ideia seria usar uma combinação de fdupes
e rsync
.
- Crie a área de teste de todos os arquivos considerados para a transferência usando
rsync
. - Exclua todas as duplicatas, exceto uma na área de preparação (apenas).
- Transfira os arquivos restantes no armazenamento temporário para o destino, novamente usando
rsync
.
Para fazer isso, precisamos de três locais:
- Originais, um caminho de diretório em
$origdir
. - Área de preparação, um caminho de diretório em
$stagingdir
. - Destino, um caminho local ou remoto em
$destdir
.
Primeiro, crie a área de preparo (isso pressupõe que a área de preparo ainda não existe ou, se existir, contém apenas coisas que devem ser transferidas):
rsync --archive --verbose --link-dest="$origdir" \
--include="*.jpg" --include="*/" --exclude="*" \
"$origdir/" "$stagingdir"
Isso copia todos os arquivos cujos nomes terminam em .jpg
para a área de preparação por meio da criação de links físicos a partir de seus locais originais. Somente o espaço para criar a estrutura de diretórios seria necessário e os dados do arquivo não seriam duplicados (a menos que $stagingdir
e $origdir
estivessem localizados em duas partições diferentes). Para adicionar outros padrões de nome de arquivo, adicione mais opções --include
( antes a --exclude
).
Em seguida, execute fdupes
over $stagingdir
:
fdupes --delete --recurse "$stagingdir"
Isso interativamente solicitará sua confirmação antes de remover qualquer coisa. Há também uma opção --noprompt
que removeria os arquivos sem confirmação. Por favor, leia o fdupes
manual cuidadosamente . Os arquivos em $origdir
não seriam afetados pela exclusão de arquivos da área de preparação,
Em seguida, exclua diretórios vazios do diretório temporário (este é um passo de bônus que apenas limpa um pouco as coisas):
find "$stagingdir" -type d -empty -delete -print
Isso passaria por toda a área de preparação e excluiria qualquer diretório vazio. Qualquer diretório excluído seria impresso após a exclusão bem-sucedida.
E, finalmente, transfira as não-duplicatas:
rsync --archive --verbose "$stagingdir/" "$destdir"
Esse processo manteria a estrutura de diretórios original para os arquivos que correspondem aos padrões usados no primeiro rsync
e que ainda são mantidos após o fdupes
remover os duplicados.