终端 - 运行'file'(文件类型)为整个目录



我是终端和bash语言的初学者,所以请温柔并彻底回答。 :)

我正在使用天鹅座终端。

我正在使用 file 命令,它返回文件类型,例如:

$ file myfile1
myfile1: HTML document, ASCII text

现在,我有一个名为test的目录,我想检查其中所有文件的类型。

我的努力:

我在手册页中检查了文件(man file(,我可以在示例中看到您可以在命令后键入所有文件的名称,它给出了所有文件的类型,例如:

$ file myfile{1,2,3}
myfile1: HTML document, ASCII text
myfile2: gzip compressed data
myfile3: HTML document, ASCII text

但是我的文件名是随机的,所以没有特定的模式可以遵循。我尝试使用 for 循环,我认为这将是答案,但这不起作用:

$ for f in ls; do file $f; done
ls: cannot open `ls' (No such file or directory)
$ for f in ./; do file $f; done
./: directory

有什么想法吗?

每个 Unix 或 Linux shell 都支持某种 glob。在您的情况下,您所需要的只是使用*球。此魔术符号表示给定路径中的所有文件夹和文件。

例如,file directory/*

Shell 将用给定路径中的所有匹配文件和目录替换 glob。实际执行的结果命令可能如下所示:

file directory/foo directory/bar directory/baz

您可以使用 findxargs 命令的组合。

例如:

find /your/directory/ | xargs file

file directory/*

可能是解决您的问题的最短最简单的解决方案,但这更像是关于为什么您的循环不起作用的答案。

for f in ls; do file $f; done
ls: cannot open `ls' (No such file or directory)
对于

这个循环,它说"对于目录或文件'ls'中的f;做..."如果您希望它执行ls命令,则需要执行以下操作

for f in `ls`; do file "$f"; done

但是,如果任何文件名包含空格,则无法正常工作。像这样使用 shell 的内置"通配"更安全、更高效

for f in *; do file "$f"; done

对于这个,有一个简单的解决方法。

for f in ./; do file $f; done
./: directory

目前,您要求它运行目录"./"的文件命令。通过将其更改为" ./*"表示当前目录中的所有内容(这与仅*相同(。

for f in ./*; do file "$f"; done

请记住,使用双引号变量以防止通配和分词。

https://github.com/koalaman/shellcheck/wiki/SC2086

最新更新