使用bash识别文件扩展名并将其附加到文件

时间:2018-10-17 23:15:36

标签: bash sed mime-types

我有一个包含许多对象的文件夹。这些对象的文件名没有扩展名。

我想使用file获取模仿类型,然后将对象重命名为object.mimetype

此刻,这就是我保存为test.sh的内容:

#!/bin/bash
for i in *;
do "EXT"==$(file "$i" --mime-type -b | sed 's#.*/##') 
combination= "$i.$EXT"
mv "$i" "$combination"

done

当我在目录上运行test.sh时,输出如下:

test.sh: line 3: EXT==tiff: command not found
test.sh: line 4: CCITT_1.: command not found
mv: cannot move 'CCITT_1' to '': No such file or directory
test.sh: line 3: EXT==jpeg: command not found
test.sh: line 4: image.: command not found
mv: cannot move 'image' to '': No such file or directory
test.sh: line 3: EXT==pdf: command not found
test.sh: line 4: Job-Description.pdf.: command not found
mv: cannot move 'Job-Description.pdf' to '': No such file or directory

所以我知道file ...命令有效是因为我已经对其进行了测试,但是我在其他所有方面都感到困惑。我要去哪里错了?

2 个答案:

答案 0 :(得分:2)

您可能希望将$(...)的输出分配给$EXT,因为您必须使用=而不是==,并且不能引用变量名。进行其他一些修改:

#!/bin/bash
for i in *; do
    ext=$(file "$i" --mime-type -b | sed 's#.*/##')
    mv "$i" "$i.$ext"
done

答案 1 :(得分:2)

您的主要问题似乎在于如何分配变量。当您为变量分配值时:

  • 不应该用引号引起来的变量–与使用$进行变量的参数扩展相反的情况
  • 只能有一个等号(第二个等号将被视为字符串值的一部分)
  • 等号两边不应有空格;否则,变量名称将被解释为命令名称。

以下应做您打算做的事情:

for i in *;
    do ext=$(file "$i" --mime-type -b | sed 's#.*/##')
    mv -v "$i" "$i.$ext"
done

注意:此代码与原始代码具有相同的假设,即,应重命名当前目录中的所有文件(包括任何非常规文件,例如目录),并且它们将按照其MIME重命名。键入,以便纯文本文件后缀为.plain