我想知道是否有任何方便的方法来做到这一点。 基本上我要做的是创建一个shellcript,它会创建多个文件类型的减记。
例如,输出可能如下所示:
ELF 64位LSB可执行文件,x86-64:$ amount
ELF 32位LSB共享>对象,INTEL:$ amount
ASCII文本:$ amount
为了让您的文字看起来像这样,您需要:
首先,首先要获取我们要检查的所有文件
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变量,以便我们可以循环遍历它们。正如您所看到的,上面的命令会转储多个文件名及其扩展名,但是我不知道如何逐个使用它们并将它们分配给我的文件变量。有什么想法吗?
或者可能有更好的解决方案呢?
答案 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