Posted to tcl by zmoment at Wed Dec 24 12:42:11 GMT 2025view raw

  1. #!/usr/bin/env tclsh
  2. #
  3.  
  4. # Compare media files in this and other directory.
  5. # Media files in both directories should have name that begins with 20251130_1200 and ends in .mp4
  6. # Get all media files of this directory.
  7. set remote_dir /partilha_casa/FOTOS/sem_duplicados
  8. #set remote_dir ../teste\ 2
  9. set remote_dir /home/lupe/Sync/fotos_teste_script_remote
  10. #set new_dir ../teste1
  11. set new_dir /home/lupe/Sync/fotos_teste_script
  12. set patterns "*.jpg *.mp4"
  13.  
  14. proc rglob { dirpath patterns {exclude_pats {}} } {
  15. set rlist {}
  16. set f_exclude [glob -nocomplain -types f -directory ${dirpath} {*}${exclude_pats}]
  17. #puts "f_exclude: $f_exclude"
  18. set d_exclude [glob -nocomplain -types d -directory ${dirpath} {*}${exclude_pats}]
  19. #puts "d_exclude: $d_exclude"
  20. foreach fpath [glob -nocomplain -types f -directory ${dirpath} {*}${patterns}] {
  21. if { ${fpath} ni ${f_exclude} } {
  22. lappend rlist ${fpath}
  23. }
  24. }
  25. foreach dir [glob -nocomplain -types d -directory ${dirpath} *] {
  26. if { ${dir} ni ${d_exclude} } {
  27. lappend rlist {*}[rglob ${dir} ${patterns} ${exclude_pats}]
  28. }
  29. }
  30. return ${rlist}
  31. }
  32.  
  33. proc getFiles {dir patterns} {
  34. set d [dict create]
  35. set patterns_lst [split $patterns]
  36. foreach p $patterns_lst {
  37. set files_in_dir [rglob $dir $p]
  38. puts "files_in_dir $files_in_dir"
  39. #set files_in_dir [glob -directory $dir -types f -nocomplain $p]
  40. foreach f $files_in_dir {
  41. puts "f: $f [file size $f]"
  42. set dt [string range [file tail $f] 0 14]
  43. dict set d $dt [list name $f size [file size $f]]
  44. }
  45. }
  46. return $d
  47. }
  48.  
  49. set n_files [getFiles $new_dir $patterns]
  50. #puts "n_files: $n_files"
  51.  
  52. #set r_files [glob -directory $remote_dir -types f -nocomplain *.jpg]
  53. set r_files [getFiles $remote_dir $patterns]
  54. #puts $r_files
  55.  
  56. set messages_deleted [list]
  57. set messages_problem [list]
  58. set messages_size_differ [list]
  59. dict for {dt d} $n_files {
  60. if {[dict exists $r_files $dt]} {
  61. set size_diff [expr {[dict get $n_files $dt size] - [dict get $r_files $dt size]}]
  62. set same_size [expr {$size_diff == 0 ? "same size" : "size differs by (bytes): $size_diff"}]
  63. if {$size_diff == 0} {
  64. file delete [dict get $n_files $dt name]
  65. if {! [file exists [dict get $n_files $dt name]]} {
  66. lappend messages_deleted "Repeated? [dict get $n_files $dt name] [dict get $r_files $dt name] $same_size DELETED."
  67. } else {
  68. lappend messages_problem "Repeated? [dict get $n_files $dt name] [dict get $r_files $dt name] $same_size PROBLEM, NOT DELETED."
  69. }
  70. } else {
  71. set extension [string range [dict get $n_files $dt name] end-2 end]
  72. if {$extension eq "jpg"} {
  73. exec viewnior [dict get $n_files $dt name] &
  74. exec viewnior [dict get $r_files $dt name] &
  75. } elseif {$extension eq "mp4"} {
  76. exec ffplay -autoexit -loglevel quiet -left 50 -top 400 -t 10 -x 800 -y 600 [dict get $n_files $dt name] &
  77. exec ffplay -autoexit -loglevel quiet -left 900 -top 400 -t 10 -x 800 -y 600 [dict get $r_files $dt name] &
  78. }
  79. puts "Delete file [dict get $n_files $dt name]? - press y or Y for yes, other key for no."
  80. set k [gets stdin]
  81. if {$k eq "y" || $k eq "Y"} {
  82. file delete [dict get $n_files $dt name]
  83. if {! [file exists [dict get $n_files $dt name]]} {
  84. lappend messages_deleted "Repeated? [dict get $n_files $dt name] [dict get $r_files $dt name] $same_size DELETED."
  85. continue
  86. } else {
  87. lappend messages_problem "Repeated? [dict get $n_files $dt name] [dict get $r_files $dt name] $same_size PROBLEM, NOT DELETED."
  88. continue
  89. }
  90. } else {
  91. lappend messages_size_differ "Repeated? [dict get $n_files $dt name] [dict get $r_files $dt name] $same_size SIZE DIFFERS BUT NOT DELETED."
  92. }
  93. }
  94. }
  95. }
  96. puts "\n\nFinal report DELETED ([llength $messages_deleted] files):"
  97. foreach m $messages_deleted {
  98. puts $m
  99. }
  100. puts "\n\nFinal report PROBLEM COULD NOT BE DELETED ([llength $messages_problem] files):"
  101. foreach m $messages_problem {
  102. puts $m
  103. }
  104. puts "\n\nFinal report NOT DELETED, SIZE DIFFERS ([llength $messages_size_differ] files):"
  105. foreach m $messages_size_differ {
  106. puts $m
  107. }

Add a comment

Please note that this site uses the meta tags nofollow,noindex for all pages that contain comments.
Items are closed for new comments after 1 week