我想将文件夹中所有文件的文件类型写入文件。
所以这就是我所做的
for xfile in *.*
do
file "x$file" > values
done
但是因为我的运气不好,它没有运行。并且错误消息是
: command not found
'/check.sh: line 3: syntax error near unexpected token `do
'/check.sh: line 3: `do
有人可以帮我解决这个问题吗?
答案 0 :(得分:5)
首先,您的变量为xfile
,但您尝试使用文字file
前面的变量x
。我认为x$file
应为$xfile
。
其次,您正在为每个文件执行file
命令并每次覆盖values
文件,这意味着只会显示最后一个文件。您可以通过预先删除文件并使用>>
(追加)代替>
(覆盖)来解决此问题。
第三,file
命令完全能够处理多个参数,所以你真的只需要:
file * >values
那也使用*
,因为*.*
是Windows / DOS的东西 - 如果你想要类UNIX操作系统下的所有文件,*
是正确的形式(或{{1如果你想隐藏文件,也可以。)
最后,上述建议都不会解决您的实际问题,这几乎肯定会在您的文件中出现DOS样式的行结尾。该错误消息与完美匹配,与您在此案例中看到的匹配。
在我的系统上,当我用DOS行结尾输入你的脚本时,我得到了相同的错误信息(主要是)。
如果您执行.*
,您很可能会看到以下内容:
od -xcb check.sh
0000020 0a0d 6f64 0a0d 6966 656c 2220 7824 6966
\r \n d o \r \n f i l e " $ x f i
015 012 144 157 015 012 146 151 154 145 040 042 044 170 146 151
个字符表示行结尾不正确。
您可以使用自己喜欢的(不错的)编辑器来查看和删除这些内容,或者只使用\r
安装dos2unix
(尽管您可能已经拥有此功能)并执行以下操作:
apt-get
然后使用# sudo apt-get install dos2unix ## only if you don't have it already.
dos2unix check.sh >check2.sh
。
虽然,请记住,单行:
check2.sh
仍然是比file * >values
循环更好的选择(但您仍然希望确保使用UNIX行结尾)。