查找并计算重复的文件名

时间:2013-05-06 06:05:03

标签: linux shell

需要递归搜索当前文件夹的所有子文件夹,并列出特定类型和重复数量的所有文件

e.g。如果当前文件夹是主页,并且有2个子文件夹dir1和dir2 然后我需要它来搜索dir1和dir2并列出文件名和重复数

这是我到目前为止: 我正在使用

find -name "*.h" .

获取特定类型的所有文件的列表。 我现在需要计算重复项并创建一个新的列表,如

 file1.h 2

 file2.h 1

其中file1是文件名,2是整体重复数。

3 个答案:

答案 0 :(得分:5)

使用uniq --count

您可以使用一组核心实用程序快速完成此操作。例如,给定以下设置:

mkdir -p foo/{bar,baz}
touch foo/bar/file{1,2}.h
touch foo/baz/file{2,3}.h

然后,您可以使用如下管道查找(并计算)文件:

find foo -name \*.h -print0 | xargs -0n1 basename | sort | uniq -c

这导致以下输出:

    1 file1.h
    2 file2.h
    1 file3.h

如果您想要其他输出格式,或者按照文件的字母顺序以其他方式对列表进行排序,您可以使用其他类型扩展管道(例如sort -nr)或使用sed,awk,perl重新格式化列,红宝石,或你选择的文字语言。

答案 1 :(得分:3)

find -name "*.h"|awk -F"/" '{a[$NF]++}END{for(i in a)if(a[i]>1)print i,a[i]}'

注意:这将打印具有相似名称的文件,并且只有在有多个文件时才会打印。

答案 2 :(得分:0)

使用shell脚本,下面的代码将打印出重复文件的文件名,然后在该列表下面显示所有重复项。

该脚本用于以下例子:

./find_duplicate.sh ./ Project

并将在当前目录树中搜索包含“project”的文件名。

#! /bin/sh

find "${1}" -iname *"${2}"* -printf "%f\n" \
    | tr '[A-Z]' '[a-z]' \
    | sort -n \
    | uniq -c \
    | sort -n -r \
    | while read LINE
      do
        COUNT=$( echo ${LINE} | awk '{print $1}' )
        [ ${COUNT} -eq 1 ] && break
        FILE=$( echo ${LINE} | cut -d ' ' -f 2-10000 2> /dev/null )
        echo "count: ${COUNT} | file: ${FILE}"
        FILE=$( echo ${FILE} | sed -e s/'\['/'\\\['/g -e s/'\]'/'\\\]'/g )
        find ${1} -iname "${FILE}" -exec echo "  {}" ';'
        echo
      done 

如果您希望搜索所有文件(而不是在名称中搜索模式,请替换该行:

find "${1}" -iname *"${2}"* -printf "%f\n" \

find "${1}" -type f -printf "%f\n" \
相关问题