【问题标题】:using file and awk to add file extensions使用 file 和 awk 添加文件扩展名
【发布时间】:2013-10-25 02:35:20
【问题描述】:

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

我发现了一个非常方便的 linux 实用程序“文件”来帮助解决这个问题。我比 bash 和 awk 更了解 Python 语法,但是我在让第 3 方“python-magic”模块在我的机器上工作时遇到了很多问题,所以我没有浪费时间尝试用 bash/ 编写它哎呀。

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

代码如下:

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 进行文件重命名的有趣方法,但至少在我看来,与“文件”结合使用,这似乎是我技能水平的最佳方法。

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

编辑:

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

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

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

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

【问题讨论】:

  • 另外,您正在尝试执行mv 程序,就像它是awk 命令一样。
  • 实际上,您的大部分awk 脚本看起来都像shell。
  • @chepner 所以我认为这不是有效的语法。我会更好地执行 mv 命令的 printf 结构并将其附加到新文件中吗?想到在 for 循环结束时,我有一个文件,它本质上是一个 mv 命令的大列表,我可以作为 shell 脚本运行?

标签: bash awk


【解决方案1】:

这里不需要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 命令。

【讨论】:

  • 啊,是的,这看起来好多了。起初它不起作用,然后我意识到(通过查看@devnull 的帖子)它只是在'for'语句之后缺少'do'语句。如果您编辑并添加“做”,我将标记为最佳答案。感谢您的帮助!
  • 我觉得这看起来有点光秃秃的 :) 已修复。
【解决方案2】:

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

所以

case $2 == 'TIFF'

应替换为:

case "TIFF"

【讨论】:

    【解决方案3】:

    我觉得语法应该是这样的:

    case "TIFF":
        mv $i "$i.pdf"
        break
    
    1. 您的 switch 语句已经引用了 $2,所以不要到处重复。
    2. 正如 anubhava 所说,请注意您的报价嵌套。
    3. 没有break,它只会掉线并运行下一行。

    【讨论】:

    • 感谢您的澄清!现在这很有意义。我已经进行了更改,并且脚本在我的测试文件上运行没有错误,但没有添加扩展名。我在原始帖子中添加了更多详细信息
    【解决方案4】:

    您最好改用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 2011-09-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多