3

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

我发现了一个非常方便的 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 进行文件重命名的有趣方法,但至少在我看来,结合 'file' 使用,这似乎是我技能水平的最佳方法。

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

编辑:

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

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

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

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

4

4 回答 4

4

No need for awk here:

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

When the output looks like a safe set of commands to run, you can remove the echo to actually execute the mv commands.

于 2013-10-24T16:09:52.963 回答
3

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

所以

case $2 == 'TIFF'

应替换为:

case "TIFF"
于 2013-10-24T15:37:45.950 回答
2

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

case "TIFF":
    mv $i "$i.pdf"
    break
  1. 您的switch声明已经引用了$2,所以不要到处重复。
  2. 正如 anubhava 所说,请注意您的报价嵌套。
  3. 没有它,break它只会掉下来并运行下一行。
于 2013-10-24T15:40:25.343 回答
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
于 2013-10-24T16:08:08.433 回答