在find命令中查找忽略目录的文件计数和文件名

时间:2016-02-11 20:38:18

标签: linux unix find command

我正在寻找类似的东西

test1 : 2 
aaa.txt 
bbb.txt

test2 : 3 
ababa.txt 
cbbab.txt 
ddddd.txt

test3 : 1 
mmmm.txt

但是我当前的代码也列出了该目录。如何删除输出中的目录

这是我的代码

find /tmp/test/ -maxdepth 2 -mindepth 1 -type d | while read dir; do printf "%s : " "$dir"; find "$dir" -maxdepth 1 -type f | wc -l; find "$dir" -maxdepth 1 -type f ; done;

我应该改变什么?

3 个答案:

答案 0 :(得分:0)

部分解决方案可在此处找到:https://superuser.com/questions/620570/how-do-i-return-only-file-names-from-the-find-command

尝试将find . -type f -exec basename {} \;命令添加到您的第一个查找查询中。

答案 1 :(得分:0)

这应该有效:

$ find . -type d -print0 | xargs -0 -I {} sh -c ' echo "{}: \c" ; find {} -maxdepth 1 -type f | wc -l ; find {} -maxdepth 1 -type f -print'

<强>更新

这个删除了不需要的路径......

$ find . -type d -print0 | xargs -0 -I {} sh -c ' echo "{}: \c" ; find {} -maxdepth 1 -type f | wc -l ; find {} -maxdepth 1 -type f -print | sed "s#.*/##" '

答案 2 :(得分:0)

并非所有输出行都会被变量捕获,因此使用${var##*/}从var中删除路径将不起作用。所以只需用sed:

切断完整输出的路径
find /tmp/test/ -maxdepth 2 -mindepth 1 -type d | 
   while read dir; do
      printf "%s : " "$dir"
      find "$dir" -maxdepth 1 -type f | wc -l
      find "$dir" -maxdepth 1 -type f
   done | sed 's#.*/##'

如果您想要更好的布局,可以使用构造:

find /tmp -maxdepth 2 -mindepth 1 -type d | while read dir; do 
   # Delete path from dir with ##*/
   printf "%s : " "${dir##*/}"
   find "$dir" -maxdepth 1 -type f | wc -l
   # Replace path with some spaces
   find "$dir" -maxdepth 1 -type f | sed 's#.*/#   #'
   # Redirect the "permission denied messages" to the end of the Galaxy.
done 2>/dev/null