我有 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=t
mv
更改上述代码中的这一行:
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