在 Ubuntu 20.10 中根据文本文件的第一行(内容)批量重命名文本文件?

在 Ubuntu 20.10 中根据文本文件的第一行(内容)批量重命名文本文件?

我有 2015 个文件.pgn。这只是一种文本文件形式,用 Notepad++ 打开。我想在 Ubuntu 20.10 中批量重命名这些文件,用相应文件内容的第一行替换它们的名称。我们如何完成这项任务?

在此处输入图片描述

这是示例文件。文件名是eco_1.pgn,我希望将其更改为图片中显示的文件内容的第一行。如果可能的话,我希望一次性对我拥有的所有 4030 个文件执行此操作。有没有简单的方法可以根据文件内容(第一行)进行批量重命名?如果有人能帮忙,我非常感谢他们。谢谢。:)

编辑:

总共有 2015 个文件。现有文件名称eco_1.pgn, eco_2.pgn, ........最多为eco_2015.pgn 我想要重命名这些文件中的每一个,以精确匹配相应文件内容的第一行。图像中显示了一个示例文件,其中第一行是:

[ECO "A00"] [Opening "Polish (Sokolsky) opening"]

因此该文件的名称应该从更改eco_1.pgn[ECO "A00"] [Opening "Polish (Sokolsky) opening"]

每个文件都是一个.pgn文件(这是一种简单的文本文件,它是用于输入棋步的便携式游戏符号)。.pgn文件也可以保存为.txt文件,没有任何问题。但我不想在这里更改扩展名。只需要更改名称,将其替换为所有 2015 文件的文件内容的第一行。谢谢。:)

答案1

要一次重命名所有文件,请使用head获取文件中的第一行,并mv使用重命名文件为了像这样循环:

for f in *.pgn
    do
    f1=$(head -n1 "$f")
    echo mv -n "$f" "$f1"
    done

从包含文件的目录中运行上述程序以查看试运行(不会发生实际重命名)。

对结果满意时,删除echo以执行实际重命名,如下所示:

for f in *.pgn
    do
    f1=$(head -n1 "$f")
    mv -n "$f" "$f1"
    done

注意:

每个文件的第一行必须是唯一的,否则某些文件将被覆盖。这就是为什么我添加了-n后面的选项mv来防止这种情况发生。

但是,如果每个文件的第一行不是唯一的,则可以通过使用下面的mv选项将数字附加到新文件名(如果它们已经存在)中,如下所示:--backup=tmv

更改上述代码中的这一行:

echo mv -n "$f" "$f1"

对此:

echo mv --backup=t "$f" "$f1"

echo可以在测试代码时保护您的文件免受意外更改,并让您模拟实际发生的情况。消除 echo以便真正进行重命名。

mv还要注意,使用 时,选项(-n或)的操作--backup=t不会反映在输出中,但删除echo时则会生效。echo

还有一件事是,如果文件的第一行包含斜杠,/这是不可接受的,并将导致错误,因此您需要重新定义变量并通过在代码后添加此行将$f1其更改为下划线:_f1=$(head -n1 "$f")

f1="${f1//\//_}" 

可以处理重复文件名和斜杠的最终工作代码是这样的(当心这将立即重命名文件不是试运行):

for f in *.pgn
    do
    f1=$(head -n1 "$f")
    f1="${f1//\//_}"
    mv --backup=t "$f" "$f1"
    done

相关内容