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

names.txt包含由单个empty line分隔的几组线.每个组都属于一个特定的文件.每组线路中的线路数量各不相同.这些行组之间唯一的相似之处是,每1行表示某个文件的旧名称,而每2行表示所述文件所需的新名称.

这些线中没有空格.还有一些其他字符,比如数字、下划线、符号和正斜杠.

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里做这个吗?请帮忙.

edit.

我已经试过看一些关于grep正则表达式的视频教程,但我觉得如果我能做一些实际的文本操作,比如查找、移动、重命名文件,我会更好地理解它,因为我也在整理和组织数百GB的媒体文件和个人文档.

我正在研究这条线索

How to rename files with filename from one txt file to filename from another txt file in bash?

edit2

推荐答案

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

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

    awk '{打印"mv\$1""2"}' RS="\n\n" RSnames.txt > renames.sh
    
  2. 判断并更正renames.sh文件.

注意:清除文件名中的所有引号'和/或双引号".每个文件名都需要用双引号"括起来.如果文件名中有'",脚本将失败.

  1. renames.sh文件中执行所有mv条命令.将renames.sh个文件作为脚本运行.

    bash renames.sh
    

awk script explantion:

RS="\n\n"

awk记录分隔符设置为empty line.

打印"mv\$1""2"

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

文件1从第1个awk字段$1检索,文件2从第2个awk字段$2检索.

Linux相关问答推荐

为什么我的Linuxshell 程序有时找不到它刚刚创建的文件?

变量在vim中打印良好,但在bashshell中打印不好,这怎么可能发生?

奇怪的 Bash 脚本行为

计算与文件第一列对应的第二列中的字符串出现次数

bind() 错误 98 - 地址已在使用中

在 Bash 中使用 shell 脚本从文件中解析版本号

如何查明第三方是否杀死或 destruct 了 C++ 中的程序

将 Visual Studio C++ 项目迁移到 Linux 和 CMake

使用 sed 命令仅打印正则表达式匹配

在 Linux 下将 TCP 流量重定向到 UNIX 域套接字

如何在 shell 脚本中动态生成新的变量名?

在 cron 作业(job)中执行 PHP 脚本

如何克隆 OpenLDAP 数据库

如何获取WiFi网络接口的MAC地址?

有没有办法在整个项目代码中的某个日期之后找出更改的文件?

如何告诉 valgrind 对Forking 进程进行 memcheck?

如何准确复制文件夹

如果关键字触发然后执行命令,Shell 脚本来监视日志(log)文件?

使用 C++ 和 Linux 的高分辨率计时器?

Bash:在文件中的特定位置插入一行