如何根据按文件类型分组的目录获取文件数量?输出可能类似于
.txt: 4
.png: 16
.jpg: 32
使用脚本实现这可能并不困难,但是 Windows 的任何命令行工具中是否内置有这样的功能?
答案1
PowerShell 方式:
gci -file | group extension -NoElement |
select @{N='Extension';E={$_.Name}}, count |
sort count -Descending
要包含子文件夹:
gci -file -recurse | group extension -NoElement |
select @{N='Extension';E={$_.Name}}, count |
sort count -Descending
根据评论中的问题进行编辑:
按子文件夹细分:
gci -ad -s | %{
$FolderName = $_.FullName
$_ | gci -af | group Extension -NoElement | select Count,
@{N='Extension';E={$_.Name}},
@{N='Folder';E={$FolderName}} | Sort Count -Desc
} | Format-Table -Property Extension, count -GroupBy Folder
基思
答案2
具体来说,并不是这样。您可以像这样编写脚本:
dir *.jpg | find /C /I "jpg"
左边部分dir *
将返回目录中的所有文件。
右侧部分find /C /I "jpg"
将查找左侧部分已返回的行,进行计数(/C
),并忽略大小写(/I
)。
并且您可以根据需要将 *.jpg 更改为其他组件。注意:这将仅返回数字/计数结果。如果您希望它按照您的问题显示 - 您需要将所有这些放入批处理文件 (.bat) 中并添加一些额外的行以使输出更清晰。
答案3
单线:
oldIFS=$IFS; IFS=$'\n'; for file in *.*; do [ -f $file ] && echo ${file##*.}; done | awk '{fileTypes[$1]++} END{for (type in fileTypes) {print "."type": "fileTypes[type]}}' | sort -n -k2; IFS=$oldIFS
扩展了注释以提高可读性和可理解性:
# Set Input Field Separator to new-line
# This allows files with whitespace in their title.
oldIFS=$IFS
IFS=$'\n'
# Loop through files in dir
for file in *
do
# Only if its a file.
[ -f $file ] && \
echo ${file##*.}
done | \
awk '
{
# Create list of file types
# Increment every time a file type is encountered
fileTypes[$1]++
}
END {
# Loop through detected filetypes
for (type in fileTypes) {
# Output filetype and count.
# Format however you want.
print "."type": "fileTypes[type]
}
}
' | sort -n -k2
# Restore old IFS.
IFS=$oldIFS