我是终端和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
您可以使用 find
和 xargs
命令的组合。
例如:
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