Solução estendida find + bash (também precisa da implementação GNU de stat ):
find . -type f -name "* (Copy).*" -exec bash -c 'p="${0%/*}"; bn="${0##*/}";
main_bn="${bn/ (Copy)/}";
if [ -f "$p/$main_bn" ]; then
t_copy_file=$(stat -c %Y "$0"); t_main_file=$(stat -c %Y "$p/$main_bn");
if [[ $t_copy_file -gt $t_main_file ]]; then
mv "$0" "$p/$main_bn";
else
rm "$0";
fi;
fi' {} \;
-
p="${0%/*}"- filepath / path com o nome de base aparado -
bn="${0##*/}"- nome de base do arquivo -
main_bn="${bn/ (Copy)/}"- remova(Copy)substring do nome da base para obter o nome de base main / common -
if [ -f "$p/$main_bn" ]- se o arquivo main / original existir (e for considerado um arquivo regular após a resolução do symlink)-
t_copy_file=$(stat -c %Y "$0")- obtenha a hora da última modificação do arquivo "copy" encontrado -
t_main_file=$(stat -c %Y "$p/$main_bn")- obtenha a hora da última modificação do arquivo original -
if [[ $t_copy_file -gt $t_main_file ]]- se o arquivo "copy" é recente - mova-o para o original (torne-o original ) commv "$0" "$p/$main_bn" - caso contrário - o arquivo original é o mais recente, removendo o arquivo " cópia " com
rm "$0"
-
Ou um pouco mais curto com -nt operador de teste de arquivo ( [ newerfile –nt olderfile ] - verifique se newerfile foi alterado mais recentemente do que olderfile ou se newerfile existe e olderfile não):
find . -type f -name "* (Copy).*" -exec bash -c 'p="${0%/*}"; bn="${0##*/}";
main_bn="${bn/ (Copy)/}";
if [ -f "$p/$main_bn" ]; then
if [ "$0" -nt "$p/$main_bn" ]; then
mv "$0" "$p/$main_bn";
else
rm "$0";
fi;
fi' {} \;