How to find duplicate filenames (recursively) in a given directory? BASH

前端 未结 7 778
执念已碎
执念已碎 2021-02-04 08:06

I need to find every duplicate filenames in a given dir tree. I dont know, what dir tree user will give as a script argument, so I dont know the directory hierarchy. I tried thi

7条回答
  •  既然无缘
    2021-02-04 08:33

    Yes this is a really old question. But all those loops and temporary files seem a bit cumbersome.

    Here's my 1-line answer:

    find /PATH/TO/FILES -type f -printf '%p/ %f\n' | sort -k2 | uniq -f1 --all-repeated=separate
    

    It has its limitations due to uniq and sort:

    • no whitespace (space, tab) in filename (will be interpreted as new field by uniq and sort)
    • needs file name printed as last field delimited by space (uniq doesn't support comparing only 1 field and is inflexible with field delimiters)

    But it is quite flexible regarding its output thanks to find -printf and works well for me. Also seems to be what @yak tried to achieve originally.

    Demonstrating some of the options you have with this:

    find  /PATH/TO/FILES -type f -printf 'size: %s bytes, modified at: %t, path: %h/, file name: %f\n' | sort -k15 | uniq -f14 --all-repeated=prepend
    

    Also there are options in sort and uniq to ignore case (as the topic opener intended to achieve by piping through tr). Look them up using man uniq or man sort.

提交回复
热议问题