使用file和awk添加文件扩展名

时间:2013-10-24 15:35:48

标签: bash awk

好吧,这可能是一个措辞不好的标题,但我不太清楚如何写它。我要做的是浏览一大堆文件(没有扩展名)并确定它们是什么,然后添加适当的扩展名。

我发现了一个非常方便的Linux实用工具,名为'file'来帮助解决这个问题。我知道python语法比bash&更好awk,但是我有很多问题让第三方“python-magic”模块在我的机器上工作,所以我没有浪费时间,而是花时间尝试用bash / awk编写它。

我相信我非常接近,但是我的语法仍然有些问题,我不确定是什么。

以下是代码:

for i in *;
    do file $i | awk '{
        switch ($2) {
        case $2 == 'TIFF':
            mv $i "$i.tif"

        case $2 == 'PDF':
            mv $i "$i.pdf"

        case $2 == 'ASCII':
            mv $i "$i.txt"

        case $2 == 'Rich':
            mv $i "$i.rtf"

        case $2 == 'gzip':
            mv $i "$i.gz"
        }
    }';
done

我在某些测试txt文件中遇到的语法错误是:

awk: cmd. line:3:         case $2 == TIFF:
awk: cmd. line:3:              ^ syntax error
awk: cmd. line:3:         case $2 == TIFF:
awk: cmd. line:3:              ^ syntax error
awk: cmd. line:3:         case $2 == TIFF:
awk: cmd. line:3:              ^ syntax error
awk: cmd. line:3:         case $2 == TIFF:
awk: cmd. line:3:              ^ syntax error
awk: cmd. line:3:         case $2 == TIFF:
awk: cmd. line:3:              ^ syntax error
awk: cmd. line:3:         case $2 == TIFF:
awk: cmd. line:3:              ^ syntax error
awk: cmd. line:3:         case $2 == TIFF:
awk: cmd. line:3:              ^ syntax error
awk: cmd. line:3:         case $2 == TIFF:
awk: cmd. line:3:              ^ syntax error
awk: cmd. line:3:         case $2 == TIFF:
awk: cmd. line:3:              ^ syntax error
awk: cmd. line:3:         case $2 == TIFF:
awk: cmd. line:3:              ^ syntax error

我看到了一些使用awk和sed进行文件重命名的其他有趣方法,但至少在我看来,与'file'结合使用时,这似乎是我技能水平的最佳方法。

如果有人可以帮我解决这些awk语法错误,那就太棒了。或者,在更通用的帮助意义上,如果您知道更好的方法来完成此任务,请分享:)

修改

我做了修改建议(固定引号,从每个案例中删除了比较运算符,添加了中断)。现在脚本运行没有错误,但没有任何文件被更改。它们仍然是无延伸的。我的测试文件都是ASCII,所以应该重命名为在末尾添加“.txt”。

为了测试并验证我用awk拉正确的字段我运行了这个小测试:

$ file test2 | awk '{printf $2}'
ASCII

所以$ 2是文件类型。关于它为什么不起作用的任何想法?

4 个答案:

答案 0 :(得分:4)

此处不需要awk

for i in *; do
    filetype=$(file $i)
    case $filetype in
        *TIFF*) ext="tif"
                ;;
        *PDF*) ext="pdf"
               ;;
        *ASCII*) ext="txt"
                 ;;
        *Rich*) ext="rtf"
                ;;
        *gzip*) ext="gz"
                ;;
    esac
    echo mv "$i" "$i.$ext"
done

当输出看起来像要运行的一组安全命令时,您可以删除echo以实际执行mv命令。

答案 1 :(得分:3)

由于您的awk脚本用单引号括起来,因此在awk中使用双引号作为文字字符串。

所以

case $2 == 'TIFF'

应替换为:

case "TIFF"

答案 2 :(得分:2)

我认为语法应该是这样的:

case "TIFF":
    mv $i "$i.pdf"
    break
  1. 您的switch语句已引用$2,因此请勿在任何地方重复此操作。
  2. 正如anubhava所说,看看你的报价嵌套。
  3. 如果没有break它只会通过并运行下一行。

答案 3 :(得分:2)

您可能最好使用shell case构造。以下内容可能对您有用:

for i in *;
    do
        type=$(file "$i" | awk '{print $2}')
        case "$type" in
        TIFF)
            mv $i "$i.tif"
;;
        PDF)
            mv $i "$i.pdf"
;;
        ASCII)
            mv $i "$i.txt"
;;
        Rich)
            mv $i "$i.rtf"
;;
        gzip)
            mv $i "$i.gz"
;;
        esac
done