bash:ls -l 和 grep

bash:ls -l 和 grep

我有这个:

find . -type f -exec file {} + | grep ASCII

这是输出:

这就是终端中打印的内容。

我想知道是否可以显示文件的大小及其路径,对于所有指示fileASCII.

答案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​​bashyashtcsh
  • (...),全局限定符zsh:另一个 90 年代的功能,但至今仍然独一无二。允许根据文件元数据进一步指定哪些文件包含在 glob 中或更改扩展值。这里:
    • D: 包括Dot(隐藏)文件
    • .:仅包含常规文件
    • L+1:只考虑大于 1 字节大的文件(否则file不会告诉您有关它们的任何信息)
    • +isasciiisascii对每个匹配的文件调用该命令来决定是否包含该文件。
  • isasciifile被定义为调用的函数$REPLY(这就是为 glob 限定符调用的函数传递文件名的方式,函数可以修改它或返回数组中的更多文件$reply)。我们${1-$REPLY}在这里使用,所以我们也可以在作为参数给出的文件上使用该函数,并且不修改$REPLY,只需通过退出状态返回决定。

    对于-b--mime-encodingfile(至少 的实现libmagic)仅输出猜测的编​​码。它比grep ASCII调用 的输出可靠得多,因为可能出现在文件路径或从文件中提取的其他信息中。file the-fileASCII

答案4

尝试这个:

对于 file_name 中的文件名find . -type f -exec file {} + | grep ASCII | awk -F ':' '{print $1}';执行 ls -lrth ${file_name};完毕

相关内容