我想知道是否有一个简单的命令可以列出具有相同名称和文件数量的所有文件?我想递归地执行此操作,我并不是指具体的文件名。我可以想象输出会是这样的:
FILENAME NUMBER
filename1 2
filename2 4
filename3 8
答案1
使用 GNU find
:
find /some/path -type f -printf '%f\n' | sort | uniq -c
使用 POSIX find
:
find /some/path -type f | sed 's~^.*/~~' | sort | uniq -c
这假设您的文件名不包含换行符。
答案2
由于同一目录中不能有同名的文件,我假设它们位于不同的目录中(例如,folder1/filefolder2/filefolder1/otherfilefolder2/otherfile)
for name in NAME1 NAME2 NAME3 ; do
echo -n $name \ \ \
ls */$name | wc -l
done
如果它们只是具有相同的前缀(即 picture1 picture2 frame1 frame2 ),那么它几乎是相同的:
for name in NAME1 NAME2 NAME3 ; do
echo -n $name \ \ \
ls $name* | wc -l
done
因为标题就在整个内容之前
echo FILENAME \ \ \ \ NUMBER
(当然是BASH脚本)
[更新评论中的以下请求:]
#!/bin/bash
# alternative 1
# put filenames sorted and without double entries into array fnames
fnames=( $( find -type f -printf "%f\n" | sort | uniq ) )
# alternative 2: including folder names:
## fnames=( $( find -printf "%f\n" | sort | uniq ) )
# count each names number of appearances:
for (( i=0 ; i<=${#fnames[@]}-1 ; i++ )) ; do
# alternative 1: files only
number=$( find -type f -wholename "*/${fnames[$i]}" -printf "%f\n" | wc -l )
# alternative 2: files and folders with same name
## number=$( find -wholename "*/${fnames[$i]}" -printf "%f\n" | wc -l )
echo -e ${fnames[$i]} \ \ \ $number
done