如何在正则表达式操作中确定当前工作文件的名称?

qwe*_*100 3 command-line bash

如果我尝试对像这样的文件运行正则表达式操作(示例):

$ mv *.ext *.new.ext
Run Code Online (Sandbox Code Playgroud)

那行不通。

如何确保当我对多个文件进行批量重命名或执行操作时,它们保留其当前名称(不是扩展名,只是名称)?

注意:我不是在寻找类似rename命令的东西,因为这必须适用于所有内容,而不仅仅是重命名文件。

注 2:好的,这些答案很好,并且向我解释了我以前没有正确理解的事情。谢谢!

我尝试使用的有问题的命令称为firmtool,并在 3DS 自制场景中使用。

它将 .bin 文件打包成 .firm 文件,我希望它在目录中的所有 .bin 文件上运行,在保留原始名称的同时打包它们。

这是我需要的firmtool命令语法:

firmtool build test.firm -n 0x23F00000 -e 0 -D arm9loaderhax.bin -A 0x23F00000 -C NDMA
Run Code Online (Sandbox Code Playgroud)

其中test.firm是输出,arm9loaderhax.bin是输入。

我想运行此命令,如果我有一个目录,test1.bintest2.bin它产生test1.firmtest2.firm。请让我知道是否可以使用正则表达式或循环来完成此命令。感谢您的任何帮助!

Zan*_*nna 5

唔。你不能1,不是普遍的。

*是通配符。外壳展开。当你输入

*.ext
Run Code Online (Sandbox Code Playgroud)

shell 将其扩展为所有匹配文件的列表,例如:

1.ext 2.ext whatever.ext
Run Code Online (Sandbox Code Playgroud)

这就是传递给命令的内容,在您的情况下mv。如果mv收到两个以上的参数,最后一个必须是目录,所以

mv *.ext *.new
Run Code Online (Sandbox Code Playgroud)

失败*.new不是目录,因为mv正在接收一长串参数。

shell 本身不支持正则表达式,但 Linux 有许多实用程序支持,例如 perl rename...

rename -n 's/(.*)\.ext/$1.new/' *
Run Code Online (Sandbox Code Playgroud)

-n在测试后删除以真正重命名......

但是您可以捕获变量中的不同名称并使用它来循环文件...

for f in *.ext; do echo mv -v -- "$f" "${f/.ext/.new}"; done
Run Code Online (Sandbox Code Playgroud)

echo在测试后删除以完成重命名...您几乎可以使用任何命令for,而不仅仅是mv. 根据您的问题,这是一个略有不同的示例:

for f in *.bin; do
  firmtool build "${f%.bin}.firm" -n 0x23F00000 -e 0 -D "$f" -A 0x23F00000 -C NDMA
done
Run Code Online (Sandbox Code Playgroud)

在这种情况下,${f%.bin}将扩展到去掉f后缀的变量的值.bin(如果它有这样的后缀;否则扩展到 的值f)。

有关其他扩展类型,请参阅Shell 参数扩展手册。

1等待被证明是错误的

  • 该过程称为 [*globbing*](http://www.tldp.org/LDP/abs/html/globbingref.html),带有 [*glob patterns*](https://en.wikipedia.org/wiki /Glob_(编程))。 (2认同)