使用重命名命令重命名文件

使用重命名命令重命名文件

请指教以下命令有什么问题

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因为每行只需要一个替换。

把它们放在一起,看起来像这样:

find /tmp/dir -type f | rename 's/^/fixed_/'

答案2

您的系统似乎具有旧版本改名不使用正则表达式。您可以使用以下命令重命名您的文件

cd /tmp/dir/
for f in *\ * ; do
    [[ -f $f ]] && mv "$f" fixed_"$f"
done

(未经测试)

为了改名具有正则表达式支持的命令,您必须更改正则表达式:*需要进行操作,这意味着“重复前一个操作零次或多次”。您不想替换任何内容,而是想在前面添加内容,因此使用^which 代表字符串的开头:

rename 's/^/fixed_/'

答案3

如果有人对 zsh 解决方案感兴趣

 cd /tmp/dir
 for f (*(.)) mv $f fixed_$f

其中 (.) 表示仅文件

更简单的情况

 for f (*.txt) mv $f fixed_$f

相关内容