Isso listará todos os arquivos em downloads que também estão em seus subdiretórios / media especificados:
find /downloads -type f | while IFS= read -r file ; do
bn=$(basename "$file")
find /media/tv /media/movie /media/music -type f -name "$bn"
done
e isso apenas imprimirá se o arquivo foi encontrado em um desses / subdiretórios de mídia ou não.
find /downloads -type f | while IFS= read -r file ; do
bn=$(basename "$file")
count=$(find /media/tv /media/movie /media/music -type f -name "$bn" | wc -l)
[ "$count" -gt 0 ] && printf "found %s\n" "$f"
done
Se houver muitos arquivos em / downloads, executar find
uma vez para cada arquivo será muito lento. Isso pode ser resolvido (se você estiver usando o GNU find
) construindo uma expressão regular contendo todos os nomes de arquivos que você quer procurar e usando as opções find
ou -regex
do GNU -iregex
.
REGEXP="^.*/\("
find /downloads -type f | while IFS= read -r file ; do
bn=$(basename "$file" | sed -e 's/\./\./g')
REGEXP="$REGEXP\|$bn"
done
REGEXP="$REGEXP\)$"
find /media/tv /media/movie /media/music -type f -iregex "$REGEXP"
E aqui está outra versão que não usa o shell read
embutido, então deve ser muito mais rápido:
REGEXP=$(find /downloads -type f | sed -e 's/^.*\/// ; s/\([]*\ .|[]\)/\/g ;
s/$/\|/' | tr -d '\n')
find /media/tv /media/movie /media/music -type f -iregex "^.*\($REGEXP\)$"
Ambas as versões regexp são limitadas pelo comprimento máximo de linha de um comando shell - muitos arquivos e eles falharão.
NOTA: como a maioria das outras respostas aqui, esses exemplos não lidam com nomes de arquivos que possuem novas linhas ( \n
) neles. Qualquer outro personagem, incluindo espaço, está bem.