Bash - 如何根据 names.txt 重命名目录中的文件

Bash - How to rename files inside a directory based on names.txt

抱歉,出于隐私原因,我无法提供实际文件名。

names.txt 包含几组由单个 empty line 分隔的行。每个组都属于一个特定的文件。每组线中的线数各不相同。这些行组之间唯一的相似之处在于,每第一行指的是某个文件的旧名称,而每第二行指的是该文件所需的新名称。

这些行中没有空格。不过还有一些其他字符,例如数字、下划线、& 符号和正斜杠。

names.txt 在同一目录中,看起来像这样:

a1.pdf
Newname_for_a1.pdf
--some-texts--

b2.pdf
Newname_for_b2.pdf
--some-texts--
--some-texts--

c3.pdf
Newname_for_c3.pdf
--some-texts--
--some-texts--

d4.pdf
Newname_for_d4.pdf
--some-texts--
--some-texts--
--some-texts--

--more_texts_below--

旧名称以小写字母开头,而新名称以大写字母开头,两者都带有 .pdf 扩展名

ls 会给出

a1.pdf
b2.pdf
c3.pdf
d4.pdf
names.txt
several-filenames-below

我可以在 Bash 中执行此操作吗?请帮助。

编辑。 最初我想处理 2 个 .txt 文件,oldnames.txt 和 newnames.txt 然后我意识到也许还有另一种方法可以只用 1 个 txt 文件。

我已经尝试过观看一些关于与 grep 相关的正则表达式的视频教程,但我觉得如果我进行实际的文本操作(例如查找、移动、重命名文件),我会更好地理解它,因为我是还在整理和组织数百 Gbs 的媒体文件和个人文档。

我正在研究这个话题

edit2 我现在可以从 names.txt 中获取每个组中第一行(旧名称)的实例 grep --color -n -E "^[a-z].*\.pdf$" names.txt 以及来自 names.txt 的每组中第二行(新名称)的实例 grep --color -n -E "^[A-Z].*\.pdf$" names.txt

因为使用 mv 命令进行重命名操作是不可逆的。

  1. 建议将所有 mv 命令写入文件 renames.sh

    awk '{print "mv \"""\"", "\"""\""}' RS="\n\n" RSnames.txt > renames.sh
    
  2. 检查并更正 renames.sh 文件。

注意:清除文件名中的所有引号 ' and/or double-quotes "。每个文件名都需要用 double-quotes " 包裹起来。如果文件名中有 '",脚本将失败。

  1. 执行 renames.sh 文件中的所有 mv 命令。通过 运行 将 renames.sh 文件作为脚本。

    bash renames.sh
    

awk 脚本说明:

RS="\n\n"

awk 记录分隔符设置为 empty line

print "mv \"""\"", "\"""\""

打印 bash 命令 mv "file1" "file2" .

从第一个 awk 字段 </code> 中检索到文件 1,从第二个 <code>awk 字段中检索到文件 2