请指教以下命令有什么问题
find /tmp/dir -name "* *" -type f | rename 's/*/fixed_/g'
备注 - 我更喜欢用一个命令而不是循环语法来做到这一点
我想要的是通过添加名称来重命名 /tmp/dir 下的所有文件固定的_每个文件之前
例如(文件)
Fevc.txt
Ddve.txt
应重命名为:
fixed_Fevc.txt
fixed_Ddve.txt
答案1
临时说明:有问题 - 重命名模式不处理带有路径的文件名;我正在修复
您的命令有两个错误:
find /tmp/dir -name "* *" -type f | rename 's/*/fixed_/g'
只匹配
-name "* *"
其中包含空格的文件名 - 这不是您想要的,对吗?- 解决方案就是将其排除在外;我们不想排除与某个名称匹配的文件 - 我们想要全部。
该
rename
模式在两个方面是错误的- 你使用了 shell glob 模式,但它需要是一个正则表达式,简而言之就是一个正则表达式(它可以是一些通用的 perl 表达式 - 让我们忽略它并仅使用
s///g
) - 固定模式将匹配完整名称,并将其替换为
fixed_
.从技术上讲,您想将“前 0 个字符”“替换”为fixed_
。这是该行的开头,与 相匹配^
。我们可以省略 ,g
因为每行只需要一个替换。
- 你使用了 shell glob 模式,但它需要是一个正则表达式,简而言之就是一个正则表达式(它可以是一些通用的 perl 表达式 - 让我们忽略它并仅使用
把它们放在一起,看起来像这样:
find /tmp/dir -type f | rename 's/^/fixed_/'
答案2
答案3
如果有人对 zsh 解决方案感兴趣
cd /tmp/dir
for f (*(.)) mv $f fixed_$f
其中 (.) 表示仅文件
更简单的情况
for f (*.txt) mv $f fixed_$f