列出具有相同名称和数量的所有文件

列出具有相同名称和数量的所有文件

我想知道是否有一个简单的命令可以列出具有相同名称和文件数量的所有文件?我想递归地执行此操作,我并不是指具体的文件名。我可以想象输出会是这样的:

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

相关内容