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' {} \;