我可以列出所有目录
find ./ -type d
我试图使用以下命令列出每个目录的内容并计算每个目录中的文件数
find ./ -type d | xargs ls -l | wc -l
但这总和由返回的行数
find ./ -type d | xargs ls -l
有没有一种方法可以计算每个目录中的文件数?
我可以列出所有目录
find ./ -type d
我试图使用以下命令列出每个目录的内容并计算每个目录中的文件数
find ./ -type d | xargs ls -l | wc -l
但这总和由返回的行数
find ./ -type d | xargs ls -l
有没有一种方法可以计算每个目录中的文件数?
Answers:
假设您已找到GNU,请让其查找目录,然后让bash进行其余操作:
find . -type d -print0 | while read -d '' -r dir; do
files=("$dir"/*)
printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done
find . -maxdepth 1 -type d | sort
;做y = find $x | wc -l
; 回声$ x,$ y; 完成
find . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
$dir
应该在第一个注释中用引号引起来,以正确处理带有空格的目录名称。:find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
这将打印当前目录级别的每个目录的文件计数:
du -a | cut -d/ -f2 | sort | uniq -c | sort -nr
du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c
。添加| sort -nr
以计数而不是目录名称排序。
find . -type f | cut -d/ -f2 | sort | uniq -c
find. -type f
查找类型文件的所有项目cut -d/ -f2
剪出他们特定的文件夹sort
对文件夹名称列表进行排序uniq -c
返回计算每个文件夹名称的次数find . -type f | cut -d/ -f2,3 | sort | uniq -c
您可以安排查找所有文件,删除文件名,在一行中仅包含每个文件的目录名,然后计算每个目录出现的次数:
find . -type f |
sed 's%/[^/]*$%%' |
sort |
uniq -c
唯一的麻烦是,如果您有任何包含换行符的文件名或目录名,这是不太可能的。如果您真的要担心文件名或目录名中的换行符,建议您找到它们并加以修复,以使它们不包含换行符(并悄悄地使犯罪的一方误解其方式)。
如果您对当前目录的每个子目录中的文件计数感兴趣,对任何子目录中的所有文件以及直接子目录中的文件计数,那么我将sed
命令修改为仅打印顶级目录:
find . -type f |
sed -e 's%^\(\./[^/]*/\).*$%\1%' -e 's%^\.\/[^/]*$%./%' |
sort |
uniq -c
第一个模式捕获名称的开头,点,斜杠,直到下一个斜杠和斜杠的名称,然后仅用第一部分替换该行,因此:
./dir1/dir2/file1
被替换为
./dir1/
第二个替换直接在当前目录中捕获文件;它们的末尾没有斜杠,而是由代替./
。然后,排序和计数仅对名称数起作用。
find
。可能有些情况:如果有一个file dir1/dir2/dir3/file1
,但dir1/dir2
仅包含子目录(没有纯文件),则可以推断出它的存在。但是,如果dir1/dir4
没有文件,它的名称就不会出现。
这是执行此操作的一种方法,但可能不是最有效的方法。
find -type d -print0 | xargs -0 -n1 bash -c 'echo -n "$1:"; ls -1 "$1" | wc -l' --
提供这样的输出,并带有目录名称,后跟该目录中的条目数。请注意,输出计数还将包括目录条目,这些目录条目可能不是您想要的。
./c/fa/l:0
./a:4
./a/c:0
./a/a:1
./a/a/b:0
bash
,ls
,wc
)通过发现每个目录find
。
man bash
,A -- signals the end of options and disables further option processing
。在这种情况下,这将防止在查找中找到的名称错误的文件成为bash参数处理的一部分。
每个人的解决方案都有一个缺点或另一个缺点。
find -type d -readable -exec sh -c 'printf "%s " "$1"; ls -1UA "$1" | wc -l' sh {} ';'
说明:
-type d
:我们对目录感兴趣。-readable
:仅在可能列出其中的文件的情况下,我们才需要它们。请注意,find
当尝试在目录中搜索更多目录时,它仍然会发出错误消息,但这会阻止调用-exec
它们。-exec sh -c BLAH sh {} ';'
:对于每个目录,运行此脚本片段,将$0
设置为,sh
并将其$1
设置为文件名。printf "%s " "$1"
:可移植且最小程度地打印目录名称,后跟一个空格,而不是换行符。ls -1UA
:按目录顺序列出文件(每行一个)(以避免使管道停顿),仅排除特殊目录.
和..
wc -l
:数线find -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
Sebastian的答案使用的略有修改的版本,find
而不是du
(排除了du
必须执行且从未使用过的与文件大小相关的开销):
find ./ -mindepth 2 -type f | cut -d/ -f2 | sort | uniq -c | sort -nr
-mindepth 2
参数用于排除当前目录中的文件。如果将其删除,则会看到许多类似以下内容的行:
234 dir1
123 dir2
1 file1
1 file2
1 file3
...
1 fileN
(非常类似于du
-based的变体)
如果确实也需要计算当前目录中的文件,请使用以下增强版本:
{ find ./ -mindepth 2 -type f | cut -d/ -f2 | sort && find ./ -maxdepth 1 -type f | cut -d/ -f1; } | uniq -c | sort -nr
输出将如下所示:
234 dir1
123 dir2
42 .
这应该返回目录名称,后跟目录中的文件数。
findfiles() {
echo "$1" $(find "$1" -maxdepth 1 -type f | wc -l)
}
export -f findfiles
find ./ -type d -exec bash -c 'findfiles "$0"' {} \;
输出示例:
./ 6
./foo 1
./foo/bar 2
./foo/bar/bazzz 0
./foo/bar/baz 4
./src 4
export -f
之所以需要,是因为的-exec
参数find
不允许执行bash函数,除非您显式调用bash,并且需要将当前作用域中定义的函数显式导出到新的shell中。
./dir1/dir2/dir3
(将文件dir1
及其子目录中的文件全部计数在一起,而不是将文件中的文件与子目录中的文件dir1/dir2/dir3
分开计数)dir1/dir2
两者分别不同于/dir1
)。
我将@glenn jackman的答案和@pcarvalho的答案结合了起来(在注释列表中,pcarvalho的答案有问题,因为字符' ` '(反引号)具有额外的样式控制功能)。
我的脚本可以接受path作为起点,并对目录列表进行排序ls -l
,也可以处理“文件名中的空格”问题。
#!/bin/bash
OLD_IFS="$IFS"
IFS=$'\n'
for dir in $(find $1 -maxdepth 1 -type d | sort);
do
files=("$dir"/*)
printf "%5d,%s\n" "${#files[@]}" "$dir"
done
FS="$OLD_IFS"
我在stackoverflow中的第一个答案,我希望它可以帮助某人^ _ ^
超快速的奇迹命令,它以递归方式遍历文件以计算目录中的图像数量,并按图像扩展名组织输出:
find . -type f | sed -e 's/.*\.//' | sort | uniq -c | sort -n | grep -Ei '(tiff|bmp|jpeg|jpg|png|gif)$'
我编辑了脚本,以排除node_modules
分析的目录中的所有目录。
这可用于检查项目的文件数是否超过文件监视程序可以处理的最大数目。
find . -type d ! -path "*node_modules*" -print0 | while read -d '' -r dir; do
files=("$dir"/*)
printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done
要检查系统可以观看的最大文件数:
cat /proc/sys/fs/inotify/max_user_watches
node_modules
在慢速系统中,应该将文件夹添加到您的IDE /编辑器排除的路径中,并且其他文件的数量理想情况下不应超过最大值(不过可以更改)。
这将给出总体计数。
for file in */; do echo "$file -> $(ls $file | wc -l)"; done | cut -d ' ' -f 3| py --ji -l 'numpy.sum(l)'
./
?