Git:一次性重命名或移动所有文件

18

我想把Git项目中所有的erb文件重命名为haml。(例如将index.html.erb重命名为index.html.haml)

如果我逐个文件进行重命名,我需要输入超过三十次以下命令。

$ git mv app/views/pages/index.html.erb app/views/pages/index.html.haml
我尝试了下面的命令,但它没有起作用。
$ git mv app/views/**/*.erb app/views/**/*.haml

usage: git mv [options] <source>... <destination>

    -n, --dry-run         dry run
    -f, --force           force move/rename even if target exists
    -k                    skip move/rename errors

如何一次性重命名它们?


这与其他mv命令相同。一次移动一个目录,或编写一个快速的bash循环来完成您现在正在尝试做的事情,如果您不想移动所有文件。 - Brian Roach
6个回答

33
for i in $(find . -iname "*.erb"); do
    git mv "$i" "$(echo $i | rev | cut -d '.' -f 2- | rev).haml";
done

对于每个 .erb 文件,使用 git mv 命令将其重命名为相同文件名但扩展名改为 ".haml"。


1
你需要将 mv 命令的第二个参数用 " 包裹起来,否则它无法处理带有空格的文件名。 - Piotr Praszmo
@Banthar 你之所以注意到这个问题,是因为我在第一次回答中就做对了 :-P。无论如何,如果文件名包含引号,这种方法都行不通——“正确”的方法是通过 printf "%q" 或类似的方式运行名称。 - Borealid
实际上,这并不重要,因为for无论如何都会在空格处分割。我想最好的解决方案是不要在文件名中放入愚蠢的字符。 - Piotr Praszmo
我的Windows Git Bash没有rev实用程序。 - Eli S

9

使用PowerShell的一行代码

Dir *.erb -Recurse | foreach { git mv $_.FullName $_.FullName.replace("erb", "haml")}

2
这个方法可以实现功能,但是会替换整个路径中所有的 erb 实例,而不仅仅是扩展名。我使用的方法是:Dir *.h -Recurse | foreach { git mv $_.FullName ($_.Directory.FullName + "\" + $_.BaseName + ".hpp") } - Vennor
只有 @Vennor 的建议对我起了作用。 - Ilya Gazman
这对我来说并没有完全起作用。我得到了一堆“fatal **** is outside repository”的投诉,可能是因为Directory.FullName部分的问题。Dir *.rdb | foreach { git mv $_.Name ($_.BaseName + ".csv") }解决了这个问题。 - Eli S

3

回应@Borealid的答案,它可以更简单:

for i in $(find . -iname "*.[old-extension]"); do
  git mv "$i" "${i/[old-extension]/[new-extension]}";
done

当中的 [old-extension][new-extension] 应该被替换成真正的扩展名。

斜杠符号 (/) 是在字符串中进行替换的 Bash 语法。(参考链接)


3

以下Powershell代码对我有效:

Get-ChildItem -File | foreach { git mv ($_.BaseName+".js") ($_.BaseName+".ts") }

为了安全起见,我选择不添加-Recurse。

将文件扩展名替换为您需要的任何内容。


1
非常方便,谢谢。在我的情况下,我想要批量移动并替换空格,所以修改了您的代码为 Get-ChildItem -File | foreach { git mv ($_.name) ($_.name –replace " ","_") } - Pauk
@Pauk 通过这个学到了新东西。谢谢! - Victor Ian

0
在Windows中,您需要2个批处理文件。一个是由我们生成的,另一个是固定的。
以下示例为将所有 *.js 递归重命名为 *.ts 的 git 重命名。 假设:文件名没有空格。
步骤1:固定文件 git-rn.bat
@echo off
set _srcfile=%1
set _tgtfile=%_srcfile:.js=.ts%
git mv %_srcfile% %_tgtfile%

将其保存在与git-rn-all.bat相同的位置/目录中

步骤2:使用命令生成文件git-rn-all.bat

cd 'C:\ projects \ some-git-project \ src \ client \ app' dir /a /s /b *.js > git-rn-all.bat

步骤3:根据我们的需求修改git-rn-all.bat

编辑git-rn-all.bat,并将所有公共基础路径进行文本替换以添加对git-rn.bat的调用。任何文本编辑器都可以轻松完成。

例如:

C:\projects\some-git-project\src\client\app\app.module.js

变成

调用 git-rn.bat C:\projects\some-git-project\src\client\app\app.module.js

步骤4:执行 git-rn-all.bat

你会看到相当多的输出

步骤5:删除批处理文件

删除 git-rn-all.batgit-rn.bat,你可能不再需要它们。


0

虽然这不是确切问题的答案,但它仍然与此问题标题相匹配,因此我认为它可能会为像我一样通过谷歌搜索来执行在文件扩展名之前添加后缀进行git重命名的人提供帮助(对我有效):

for i in *.<file extension>
do
    git mv -v "${i}" "${i%.*}_SUFFIX.${i##*.}"
done
  • <文件扩展名> 应替换为所需的类型,例如 C 文件的扩展名为 c
  • _SUFFIX 应在文件类型之前替换为所需的后缀
  • 如果您不使用 git 而只是 Linux bash,请从命令中删除 git

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接