Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 递归地指出目录中的文件数_Bash_Shell_Find - Fatal编程技术网

Bash 递归地指出目录中的文件数

Bash 递归地指出目录中的文件数,bash,shell,find,Bash,Shell,Find,假设xyz为1000,找出根目录下包含超过给定数量的文件xyz的所有目录,并将返回的数字和目录的输出保存在一个文件或更好的:变量中,该命令是什么 find . -type d | while read dir; do printf '%d\t%s\n' $(find "$dir" -maxdepth 1 -type f | wc -l) "$dir" done | sort -rn 这将打印每个目录以及其中有多少文件。它会对它们进行排序,使文件最多的文件排在第一位 如果要将打印输出限制

假设xyz为1000,找出根目录下包含超过给定数量的文件xyz的所有目录,并将返回的数字和目录的输出保存在一个文件或更好的:变量中,该命令是什么

find . -type d | while read dir; do
    printf '%d\t%s\n' $(find "$dir" -maxdepth 1 -type f | wc -l) "$dir"
done | sort -rn
这将打印每个目录以及其中有多少文件。它会对它们进行排序,使文件最多的文件排在第一位

如果要将打印输出限制为至少包含$limit文件的目录,请执行以下操作:

find . -type d | while read dir; do
    count=$(find "$dir" -maxdepth 1 -type f | wc -l)
    (($count >= $limit)) && printf '%d\t%s\n' "$count" "$dir"
done | sort -rn
为了使其更加健壮,并处理带有空格和其他特殊字符的不寻常文件名,可以添加一些标志来查找和读取。从技术上讲,允许文件名中包含制表符和换行符,因此最好编写具有防御性的脚本,这样这些类型的文件名就不会引起问题

find . -type d -print0 | while read -d $'\0' -r dir; do
    count=$(find "$dir" -maxdepth 1 -type f -exec echo \; | wc -l)
    (($count >= $limit)) && printf '%d\t%s\n' "$count" "$dir"
done | sort -rn
使用find和dirname:

递归查找当前目录下的所有文件,然后截断文件名,只保留每个文件的父目录。这些文件已经排序,因此uniq-c将计算每个目录包含的文件数,awk只打印其中包含1000多个文件的文件

要将结果保存到文件中,请执行以下操作:

find "$DIR" ... | awk '$1>=1000{print}' > file.txt
要保存在变量中,请执行以下操作:

var=$(find "$DIR" ... | awk '$1>=1000{print}')

命令是find。然后,您应该检查可以使用哪些参数来获得该输出。你尝试过什么?根据我老板的说法,情况很不幸发生了变化。每个文件夹中的特定文本文件包含其中所有文件的全部大小(共3个文件中的第2个)。给定的数字100000 KB不允许交叉。如果文件大小大于100000(包括转储到变量中的文件夹名称),则这种递归查询将如何提供文件大小?
var=$(find "$DIR" ... | awk '$1>=1000{print}')