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.