我有一个git repo,其中包含大量(数千)提交的文件。我想用批处理命令行命令重命名它,类似于
git mv *.txt *.md
字符串但是收到了fatal: bad source, source=*.txt, destination=*.md消息。如何使用git cli重命名提交的文件?
fatal: bad source, source=*.txt, destination=*.md
mgdq6dx11#
Git不支持这种开箱即用的方式,但是你可以使用shell的特性来执行这个任务:
for file in *.txt; do git mv "$file" "${file%.txt}.md"; done
字符串${file%.txt}.md将展开file变量,去掉其.txt扩展,然后在其值后追加.md。
${file%.txt}.md
file
.txt
.md
enxuqcxy2#
为了获得最大的CPU效率,Git的核心update-index命令可以在stdin上进行批量更新:
update-index
git ls-files -s \*.txt \ | sed -r 's,([^ ]* )(.*)\.txt,0 \2.txt\n\1\2.md,' \ | git update-index --index-info
字符串其将在一次通过中完成索引更新。然后,您可以让git read-tree在一次传递中完成您的工作树更新
git read-tree
newtree=`git write-tree` git read-tree @ git read-tree -u --reset @ $newtree
型sed将转储的索引条目git ls -s转换为两个索引更新,一个删除(模式0)条目用于旧的*.txt名称,一个插入条目用于新的*.md名称。git read-tree是checkout和merge以及许多其他批量工作树更新器的核心命令,上面的顺序是“为索引写一个树,将其重置为checkout时的状态,然后读取新树并更新工作树以匹配,就像我们正在执行checkout或快进合并一样”。编辑:为了最大的方便,你可以改为
sed
git ls -s
*.txt
*.md
find -name \*.txt -execdir rename .txt .md {} + git add -A .
型这也将拾取您在工作树中可能具有的任何其他更改;这是不太“安全”的,你可能不想添加任何其他的更改,或者你的.gitignore可能还没有调好,但是如果你的构建是干净的,这可能会保存更多的输入时间,而不是花费在make-Git-figure-it-all-out上的时间。
.gitignore
blmhpbnm3#
更改文件扩展名
如果您有很多具有特定文件扩展名的文件,并且您希望将其更改为其他兼容的扩展名,则可以使用以下命令:
ren *.ext1 *.ext2
字符串命令语法示例:
ren *.txt *.md
型命令语法示例将文件夹中所有文件的.txt文件扩展名更改为.md格式。
使用特定文件扩展名重命名文件
第一个月上面的命令将重命名文件夹中的所有文件。如果要仅重命名扩展名为.jpg的图像文件,可以使用以下命令:
ren nyc_*.jpg newYork_*.jpg.
型
重命名多个文件
要重命名多个文件,请使用以下命令语法:
ren *.ext1 ???-new_filename_part.*
型命令语法示例:
ren *.jpg ???-hikingTrip.*
vsmadaxz4#
Git没有内置的“批量重命名”操作,但这并不重要:你可以按你喜欢的方式进行批量重命名,然后git add新名称和git add -u拿起删除(所有)旧名称,或者只是git add旧名称。那就是:
git add
git add -u
$ git mv old new
字符串有着与之完全相同的效果:
$ mv old new $ git add old new
型为了演示,我实际上已经在一个临时测试存储库中运行了上述两个命令,现在我运行git status:
git status
On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) renamed: old -> new
型当然,knittl's answer是可以的,但我也想展示一下我自己是如何完成任务的:
$ echo *.txt | sed 's/\(.*\).txt/git mv \1.txt \1.md/' git mv a.txt b.txt a.txt b.md
$ printf %s\\n *.txt | sed 's/\(.*\).txt/git mv \1.txt \1.md/' git mv a.txt a.md git mv b.txt b.md
| sh
$ printf %s\\n *.txt | sed 's/\(.*\).txt/git mv \1.txt \1.md/' | sh
型换句话说,我喜欢写一个单行脚本来生成应该运行的命令,然后重新运行单行脚本,并将输出重定向到一个管道中,馈送sh来运行它们。如果一行脚本能满足我的大部分需求,但有一些情况需要手动调整,我将| sh替换为> /tmp/doit.sh,然后编辑/tmp/doit.sh脚本来进行手动调整。
sh
> /tmp/doit.sh
/tmp/doit.sh
t1qtbnec5#
在Windows10上,Git Bash,我工作如下,以便将扩展名.css更改为.scss
find . -name "*.css" -exec sh -c 'git mv "$1" "${1%.css}.scss"' _ {} \;
字符串
5条答案
按热度按时间mgdq6dx11#
Git不支持这种开箱即用的方式,但是你可以使用shell的特性来执行这个任务:
字符串
${file%.txt}.md
将展开file
变量,去掉其.txt
扩展,然后在其值后追加.md
。enxuqcxy2#
为了获得最大的CPU效率,Git的核心
update-index
命令可以在stdin上进行批量更新:字符串
其将在一次通过中完成索引更新。然后,您可以让
git read-tree
在一次传递中完成您的工作树更新型
sed
将转储的索引条目git ls -s
转换为两个索引更新,一个删除(模式0)条目用于旧的*.txt
名称,一个插入条目用于新的*.md
名称。git read-tree
是checkout和merge以及许多其他批量工作树更新器的核心命令,上面的顺序是“为索引写一个树,将其重置为checkout时的状态,然后读取新树并更新工作树以匹配,就像我们正在执行checkout或快进合并一样”。编辑:为了最大的方便,你可以改为
型
这也将拾取您在工作树中可能具有的任何其他更改;这是不太“安全”的,你可能不想添加任何其他的更改,或者你的
.gitignore
可能还没有调好,但是如果你的构建是干净的,这可能会保存更多的输入时间,而不是花费在make-Git-figure-it-all-out上的时间。blmhpbnm3#
更改文件扩展名
如果您有很多具有特定文件扩展名的文件,并且您希望将其更改为其他兼容的扩展名,则可以使用以下命令:
字符串
命令语法示例:
型
命令语法示例将文件夹中所有文件的.txt文件扩展名更改为.md格式。
使用特定文件扩展名重命名文件
第一个月
上面的命令将重命名文件夹中的所有文件。如果要仅重命名扩展名为.jpg的图像文件,可以使用以下命令:
型
重命名多个文件
要重命名多个文件,请使用以下命令语法:
型
命令语法示例:
型
vsmadaxz4#
Git没有内置的“批量重命名”操作,但这并不重要:你可以按你喜欢的方式进行批量重命名,然后
git add
新名称和git add -u
拿起删除(所有)旧名称,或者只是git add
旧名称。那就是:字符串
有着与之完全相同的效果:
型
为了演示,我实际上已经在一个临时测试存储库中运行了上述两个命令,现在我运行
git status
:型
当然,knittl's answer是可以的,但我也想展示一下我自己是如何完成任务的:
型
型
| sh
:*型
换句话说,我喜欢写一个单行脚本来生成应该运行的命令,然后重新运行单行脚本,并将输出重定向到一个管道中,馈送
sh
来运行它们。如果一行脚本能满足我的大部分需求,但有一些情况需要手动调整,我将| sh
替换为> /tmp/doit.sh
,然后编辑/tmp/doit.sh
脚本来进行手动调整。t1qtbnec5#
在Windows10上,Git Bash,我工作如下,以便将扩展名.css更改为.scss
字符串