需要递归搜索当前文件夹的所有子文件夹,并列出特定类型和重复数量的所有文件
e.g。如果当前文件夹是主页,并且有2个子文件夹dir1和dir2 然后我需要它来搜索dir1和dir2并列出文件名和重复数
这是我到目前为止: 我正在使用
find -name "*.h" .
获取特定类型的所有文件的列表。 我现在需要计算重复项并创建一个新的列表,如
file1.h 2
file2.h 1
其中file1是文件名,2是整体重复数。
答案 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" \