including subdirectories.
Code: Select all
;; dup-files
;;
;; Searching duplicate file names in directory, including subdirectories.
;;
;; syntax: (dup-files dir)
;; syntax: (dup-files dir str-pattern)
;;
;; In the first form returns a list of ALL pairs (filename directory)
;; where filename has duplicated file names in directory "dir"
;;
;; In the second form returns a list of pairs (filename directory)
;; where filename satisfy regular expression "str-pattern" and
;; has duplicated file names in directory "dir"
;;
;; ATTETION! Works only with newlisp-8.7.2 and later
;;
;; Example1:
;; (load "dup-files.lsp")
;; (println (dup-files "c:"))
;;
;; Example2:
;; (load "dup-files.lsp")
;; (setq li (dup-files "c:" "\.jpg$"))
;; (println (format "%20s %20s %10s %s" "Filename" "Modification time" "Size" "Directory"))
;; (dolist (x li)
;; (setq tv (select (file-info (append (nth 1 x) (nth 0 x))) 0 6))
;; (println
;; (format "%20s %20s %10d %s"
;; (nth 0 x) (date (nth 1 tv) 0 "%Y-%m-%d %H:%M:%S") (nth 0 tv) (nth 1 x) ) ) )
;;
(context 'dup-files)
(setq file-mask nil)
(setq list1 '())
(define (dup-files:dup-files d f-mask)
(if f-mask (setq file-mask f-mask) (setq file-mask ".*"))
(replace "\\" d "/")
(unless (ends-with d "/") (setq d (append d "/" )))
(file-tree d)
(let (li (map (lambda (x) (nth 0 x)) list1))
(setq li (map (lambda (x y) (if (!= y 1) x 0)) list1 (count li li) ))
(sort (replace 0 li)) ) )
(define (file-tree d)
(dolist (f (replace "." (replace ".." (directory d))))
(if (directory? (append d f))
(file-tree (append d f "/"))
(if (regex file-mask f 1) (push (list f d) list1)) ) ) )
(context 'MAIN)
Excuse me for my bad English.