答案1
这使用 cut 从 的输出中提取文件名file | grep ASCII
,然后将其通过管道传输xargs stat -c ...
以仅显示文件名和大小:
find . -type f -exec file {} + | grep ASCII | cut -d: -f1 | xargs -d'\n' -r stat -c '%n %s'
如果您想要文件名之前的大小,请'%s %n'
在stat
命令中使用。
它将处理包含除:
换行符之外的任何字符的文件名。它假定一个 GNU 系统(for-d
和 thatstat
语法)。如果ASCII
文件路径中存在,则可能会给出误报。
答案2
我会使用 shell 循环来代替。如果您正在使用bash
,您可以**
通过运行来递归到子目录shopt -s globstar
。正如中所解释的man bash
:
globstar
If set, the pattern ** used in a pathname expansion con‐
text will match all files and zero or more directories
and subdirectories. If the pattern is followed by a /,
only directories and subdirectories match.
因此,考虑到这一点,您可以使用以下循环:
shopt -s globstar
for file in **; do
[ -f "$file" ] && file "$file" | grep -q "ASCII" && stat -c '%n %s' "$file"
done
答案3
和zsh
:
isascii() [[ $(file -b --mime-encoding - < ${1-$REPLY}) = us-ascii ]]
zmodload zsh/stat
zstat -n +size -- **/*(D.L+1+isascii)
细分:
**/*
递归通配符,zsh 在 90 年代初引入的功能,后来被其他一些 shell 复制像ksh93
、、、和。fish
bash
yash
tcsh
(...)
,全局限定符zsh
:另一个 90 年代的功能,但至今仍然独一无二。允许根据文件元数据进一步指定哪些文件包含在 glob 中或更改扩展值。这里:D
: 包括Dot(隐藏)文件.
:仅包含常规文件L+1
:只考虑大于 1 字节大的文件(否则file
不会告诉您有关它们的任何信息)+isascii
:isascii
对每个匹配的文件调用该命令来决定是否包含该文件。
isascii
file
被定义为调用的函数$REPLY
(这就是为 glob 限定符调用的函数传递文件名的方式,函数可以修改它或返回数组中的更多文件$reply
)。我们${1-$REPLY}
在这里使用,所以我们也可以在作为参数给出的文件上使用该函数,并且不修改$REPLY
,只需通过退出状态返回决定。对于
-b
和--mime-encoding
,file
(至少 的实现libmagic
)仅输出猜测的编码。它比grep ASCII
调用 的输出可靠得多,因为可能出现在文件路径或从文件中提取的其他信息中。file the-file
ASCII
答案4
尝试这个:
对于 file_name 中的文件名find . -type f -exec file {} + | grep ASCII | awk -F ':' '{print $1}'
;执行 ls -lrth ${file_name};完毕