需要递归搜索当前文件夹的所有子文件夹并列出特定类型和重复数量的所有文件
例如,如果当前文件夹是 home 并且有 2 个子文件夹 dir1 和 dir2 然后我需要它来搜索 dir1 和 dir2 并列出文件名和重复的数量
这就是我到目前为止所拥有的:我正在使用
find -name "*.h" .
获取特定类型的所有文件的列表。我现在需要计算重复项并创建一个新列表,例如
file1.h 2
file2.h 1
其中 file1 是文件名,2 是总体重复数。
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、ruby 或您的文本重新格式化您的列选择的语言。
find -name "*.h"|awk -F"/" '{a[$NF]++}END{for(i in a)if(a[i]>1)print i,a[i]}'
注意:这将打印具有相似名称的文件,并且仅当存在多个文件时。
使用 shell 脚本,以下代码将打印一个文件名,其中包含重复项,然后在该文件名下方列出所有重复项。
该脚本在以下示例中使用:
./find_duplicate.sh ./ 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" \