如果我尝试对像这样的文件运行正则表达式操作(示例):
$ 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.bin
而test2.bin
它产生test1.firm
和test2.firm
。请让我知道是否可以使用正则表达式或循环来完成此命令。感谢您的任何帮助!
唔。你不能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等待被证明是错误的
归档时间: |
|
查看次数: |
231 次 |
最近记录: |