如何按类型获取文件计数,递归

时间:2017-03-19 00:38:28

标签: bash shell

我想知道是否有任何方便的方法来做到这一点。 基本上我要做的是创建一个shellcript,它会创建多个文件类型的减记。

例如,输出可能如下所示:

  

ELF 64位LSB可执行文件,x86-64:$ amount
  ELF 32位LSB共享>对象,INTEL:$ amount
  ASCII文本:$ amount

为了让您的文字看起来像这样,您需要:

  1. 创建需要检查的文件列表
  2. 获取文件名
  3. 将它们提供给文件实用程序
  4. 从输出中剪切特定行
  5. 首先,首先要获取我们要检查的所有文件

    find $DIR -type f | ls -1
    

    将打印以下内容(显然是一个示例,结果因设置为$ DIR

    而不同
      

    mysript.sh
      的Game.exe
      的text.txt

    通过这个,我们将在STDOUT中找到当前目录中所有FILES的列表。 但是现在我不确定如何将这些文件名1逐1地提供给文件实用程序以基本上获得我的输出。

    最大的问题是,file util只能处理1个文件,而不能处理多个目录等。

    所以我唯一能想到的就是这样做

        FILE_AMOUNT=`find $PWD -type f | ls -1 | wc -l`
        while [ "$i" -lt "$FILE_AMOUNT" ] 
        do
             #code here
             $(( i++ ))
             PRINT_TYPE=`file $myfile | cut -d":" -f2`
        done
    

    但是我不确定如何逐个获取文件并将它们分配给myfile变量,以便我们可以循环遍历它们。正如您所看到的,上面的命令会转储多个文件名及其扩展名,但是我不知道如何逐个使用它们并将它们分配给我的文件变量。有什么想法吗?

    或者可能有更好的解决方案呢?

1 个答案:

答案 0 :(得分:1)

file命令无法从标准输入读取。因此,我们需要遍历文件,在每个文件上调用file,并在关联数组中收集摘要:

#!/bin/bash

declare -A file_types
while read -r file; do
  type=$(file -b "$file") # -b tells file not to prefix the file name in output
  ((file_types[$type]++))
done < <(find "$PWD" -type f)

# traverse the associative array and print results
for type in "${!file_types[@]}"; do
  printf '%s: %s\n' "$type" "${file_types[$type]}"
done

可以更有效地编写第一个循环,而无需在子shell中调用file,如下所示:

while read -r type; do
  ((file_types[$type]++))
done < <(find "$PWD" -type f -print0 | xargs -0 file -b)

对于我的目录,它给出:

VAX COFF executable - version 5424: 1
VAX COFF executable - version 10614: 1
VAX COFF executable not stripped: 5
VAX COFF executable not stripped - version 902: 1
Perl5 module source text, ASCII text: 7
VAX COFF executable: 3
ASCII text: 23
Perl POD document text, UTF-8 Unicode text: 1
empty: 2
Bourne-Again shell script text executable, ASCII text: 2
VAX COFF executable - version 67: 1
a /usr/bin/env ruby script text executable, ASCII text: 1
POSIX shell script text executable, ASCII text: 12
Git index, version 2, 3 entries: 1
a /usr/bin/perl -w script text executable, ASCII text: 12
ASCII text, with very long lines: 2
Vim swap file, version 7.4: 1