Files
bin/check_for_dups

53 lines
1.2 KiB
Tcl
Executable File

#!/bin/sh
# \
exec tclsh "$0" ${1+"$@"}
proc FindFiles {dir} {
global argv0 files
if { [catch {glob $dir/* $dir/.*} ents] } { return }
foreach ent $ents {
if { [file tail $ent] == "." || [file tail $ent] == ".." } { continue }
if { [file isdirectory $ent] } {
FindFiles $ent
} else {
lappend files $ent
}
}
return
}
if { $argc != 1 } {
puts "Usage: $argv0 <dir>"
exit 1
}
set files ""
FindFiles [lindex $argv 0]
set orig_list $files
foreach file "$files" {
if { [catch { file size $file } size($file)] } {
puts stderr "$file does not exist (sym link to nothing?)"
}
if { $size($file) == 0 } { puts "$file is zero bytes!" }
}
set cnt 0
foreach file "$orig_list" {
if { $cnt == 75 } {
puts -nonewline "."
flush stdout
set cnt 0
}
incr cnt
foreach tst_f $files {
if { $size($tst_f) != $size($file) } { continue }
if { $tst_f == $file || $size($file) == 0 } { continue }
catch {eval exec diff -s $file $tst_f} output
if { [regexp "identical" $output m] == 1 } {
puts stderr "$file == $tst_f (size: $size($file))"
}
}
# only check remainder of files (e.g. lindex 0 was just compared)
set files [lrange $files 1 end]
}