如何重命名大量文件

2024-02-10

我有一个包含这样的文件的目录

a.JPG
b.JPG
c.JPG

我想做这样的事情

git mv a.JPG a.jpg

我尝试使用 xargs 和其他工具,但似乎没有任何效果。


该解决方案的核心是使用一种工具/方法来自动执行批量重命名。您可以使用mv结合git add要不就git mv。在任何一种情况下,如果您使用不区分大小写的文件系统,则可能需要采取额外的步骤。因此,在我们处理批量重命名之前,讨论一下大小写的处理方式可能会很有用。

区分大小写

Some systems (or system+filesystem combinations—like the default variant of the HFS+ filesystem on Mac OS X*) are case preserving, but case insensitive. On such systems, you may need to be careful when making renames that involve only changing the case of a name. The usual workaround is to use a temporary name that differs by more than just case as a “bridge” between the two names that differ by case alone (e.g. mv foo.JPG tmp && mv tmp foo.jpg).

* It is possible to use case sensitive file systems on Mac OS X (including a case sensitive variant of HFS+).

从这里开始,我将假设一个不区分大小写的文件系统。

The mvMac OS X 上的命令可以一步处理仅大小写更改的重命名。它会给出一个“覆盖?”如果运行时提示-i选项,如果给定,它将跳过重命名-n选项。它只有通过类 Unix 系统许多部分的“足够的绳子来吊死自己”的默认操作才能成功。

The git mv指挥部对这种情况有点偏执。除非给出,否则它拒绝操作(“目的地存在”错误)-f/--force option.

# this will succeed, though it may fail/prompt if mv is aliased to use -n/-i
mv foo.JPG foo.jpg

# this will succeed
mv -f bar.JPG bar.jpg

# this will succeed but give a warning
git mv -f quux.JPG quux.jpg

批量重命名选项

Perl重命名

所需的操作非常简单,只需编写一些 shell 脚本即可完成,但您可以获得 Perlrename如果你需要做一些更复杂的事情,那么实用程序(乔丹·刘易斯提到的那个)。你可以尝试rename来自 Debian 的perl package http://git.debian.org/?p=perl/perl.git;a=blob_plain;f=debian/rename;hb=HEAD,或者如果您愿意使用 CPAN,您可以安装文件::重命名 http://search.cpan.org/dist/File-Rename/,其中包括rename程序。

ksh, bash, zsh, dash

The -ef下面使用的不兼容 POSIX。同样,虽然-e是在 POSIX 中指定的,它不与纯 Bourne 兼容。但两者都得到了广泛的支持。

for f in *.JPG; do
    ff="${f%.JPG}.jpg"
    test -e "$f" || continue        # possible when not using nullglob
    test "$f" != "$ff" || continue  # possible when using nocaseglob
    if test -e "$ff" &&
       ! test "$f" -ef "$ff"; then  # possible on a case sensitive filesystem
        echo "skipping <$f>: destination <$ff> exists and is distinct" 1>&2
        continue
    fi

    # "mv" with "git rm" and "git add"
    mv -f "$f" "$ff"     &&
    git rm --cached "$f" &&
    git add "$ff"
done

最后一节(mv, git rm, git add)可以替换为git mv:

    # "git mv"
    git mv -f "$f" "$ff"

如果您非常担心重命名在不区分大小写的系统上可能会失败,那么您可以使用临时名称:

    # temp-based "mv" with "git rm" and "git add"
    t="$ff.tmp"; while test -e "$t"; do t="$t.tmp"; done
    mv -n "$f" "$t"      &&
    mv -n "$t" "$ff"     &&
    git rm --cached "$f" &&
    git add "$ff"

Or with git mv:

    # temp-based "git mv"
    t="$ff.tmp"; while test -e "$t"; do t="$t.tmp"; done
    git mv "$f" "$t"  &&
    git mv "$t" "$ff"

zsh/zmv

这个需要-f对彼此而言zmv and git mv.

zsh -c 'autoload zmv && $0 $@' zmv -fp git -o 'mv -f' '(*).JPG' '$1 x.jpg'

现在您已将它们全部重命名并更新到 Git 的索引中,您可以提交它们了。

但是使用区分大小写的文件系统的其他 Git 用户是否能够查看它们?

git 结账仅大小写重命名后

如果您的历史记录中有其他用户,他们可能仍然拥有JPG文件,以及当它们最终签出您的提交(的后代)时jpg文件。他们会发生什么?

无论发生什么,都不需要“重命名为 temp,提交,重命名为 Final,提交”。git 结账在提交之间移动时不会按顺序应用提交。它实际上是通过将索引和工作树从 HEAD“合并”到新的提交来工作的。这实际上意味着它直接“跳转”到新提交,同时拖动 HEAD 和索引/工作树之间发现的非冲突更改。

在内部,Git 将重命名视为删除和添加。我没有找到任何描述行为的文档git 结账关于删除和添加的顺序,所以我看了源码。git 结账在任何更新/添加之前处理所有删除(cmd_checkout -> switch_branches -> merge_working_tree (-> reset_tree) -> unpack_trees ->检查更新 http://git.kernel.org/?p=git/git.git;a=blob;f=unpack-trees.c;h=c29a9e067ff362063d6626e8e4d1e4466d63b8af;hb=HEAD#l76).

您可以在重命名提交后立即进行测试:

git checkout HEAD~ # note: detached HEAD
# verify that the original names are back in place
git checkout -     # back to your branch
# verify that the new names are in place again

The git 责备文件上似乎表明可能的提交:使 unpack-tree 在任何更新的文件之前更新删除的文件 http://git.kernel.org/?p=git/git.git;a=commit;h=1fa6ead492c81bffdbe336373e5b162d3b5ac6d3,首次发布于 Git 1.5.6-rc0 (2008-06-18)。因此,虽然没有记录(?),但这种行为是专门为了支持不区分大小写的文件系统而实现的。

谢谢,莱纳斯!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重命名大量文件 的相关文章

  • GIT:向非当前分支添加本地更改

    我通常会遇到这样的情况 我做了一些本地更改 却发现我在错误的分支上进行了更改 因此我需要在提交之前切换分支 问题是当有本地更改时我无法切换分支 有办法做到这一点吗 显然 我可以复制更新的文件 切换分支 然后将它们复制回来 但这看起来并不聪明
  • 包括来自raw.github.com的js

    我有一个 github com 演示页面 链接到https raw github com master file js https raw github com master file js这样我就不需要总是复制 js文件转移到gh pag
  • 如何使用 vim 作为“git log”编辑器?

    当我跑步时git log 编辑器到底是什么git log正在使用 Also 无论如何我可以使用吗vim作为我的默认编辑器git log 如果我想搜索 git 日志 最好的方法是什么 现在我正在做类似的事情 git log grep bla
  • 将更改从通用差异导入 git 存储库

    我正在尝试将更改从一个源代码控制系统 专有且复杂 导入到 git 存储库中 我目前正在通过运行一个脚本来执行此操作 该脚本只是按顺序同步到每个修订版并将其提交到 git 存储库 但由于各种原因 这已变得不可行 对于每个修订版 我都可以获得描
  • Git 将开发分支与生产版本的主分支合并

    我正在使用 Git 进行代码版本控制 我有一个开发分支 我正在其中进行所有肮脏的开发 每次我向世界发布生产版本时 我都想将其放在我的 master 分支下 问题是 每当我合并开发和 master 时 master 都会收到所有开发历史记录
  • Git 存储库错误并显示消息,它不是存储库...但它是

    我有一个 git repo 去年我一直在同一个盒子上使用 今天我跑步git status并得到错误消息 fatal Not a git repository or any parent up to mount parent home Sto
  • 在单独的终端屏幕上显示 git diff 和 git log 输出

    设置新的开发环境后 我遇到了一个奇怪的 git 行为 我不记得过去见过 我习惯于git diff and git log在终端中创建一个新屏幕并在其中显示其输出 什么less默认情况下 我用它作为我的寻呼机 然后我可以退出并返回到之前的终端
  • 中止 `git stash apply` [重复]

    这个问题在这里已经有答案了 我很遗憾应用了存储 错误的分支 我如何撤消此操作并将我的存储返回到我的存储列表 以便稍后将其应用到正确的分支 如果你还没有承诺 你应该能够git stash再次 可能与git reset HEAD first A
  • 在 Windows 上从源代码构建 PhantomJS-2

    我正在尝试基于这些在 Windows 8 1 x64 上从源代码构建 PhantomJS 2 的开发版本指示 https github com ariya phantomjs wiki PhantomJS 2 但是我收到以下错误 mingw
  • ssh:连接到主机 bitbucket.org 端口 22:连接超时

    一切都工作得很好 做了一些git pushes 没有问题 今天我决定将我的框架更新到最新版本 因此它稍微改变了我项目的目录结构 因此 在 Bitbucket 中 我创建了一个新的存储库 dev1 project com 并将我的项目文件夹重
  • 使用 Git 部署时压缩 JS/CSS 文件

    我对 git 有点陌生 另外 这是我第一个自动化部署过程的项目 到目前为止 能够做到这一点真是太幸福了git push dev并上传文件 复制配置文件等 现在 当我推送到我的开发服务器时 我想缩小 JS CSS 文件 我正在考虑在服务器上安
  • 尝试安装 AWS CLI,卡在一个步骤上

    我正在尝试为 mac 命令行安装 aws 我想我不明白我需要做什么 我在终端上安装了带有 wget 的 aws 捆绑包 解压后它完成了所有操作 但是当我需要配置我的凭据时 什么也没有出现把aws配置 以下是说明 http docs aws
  • 永久删除 git 提交历史记录

    我需要永久且完全删除 git 存储库的提交历史记录并继续使用文件的当前版本 旧版本 提交不得以任何方式访问 我尝试创建一个新的主分支 删除所有其他分支 但是当我在 git bash 中尝试 git show xxxx 时 旧的提交继续显示
  • 使 .git 目录 web 不可访问

    我有一个网站 我使用 github 闭源 来跟踪更改和更新网站 唯一的问题是 git 目录似乎可以通过网络访问 我怎样才能停止这个并且仍然能够使用 git 我应该使用 htaccess 吗 我应该更改 git 的权限吗 把这个放在一个 ht
  • “git merge --squash”的正确用例是什么?

    有些人喜欢git merge squash由于以下原因 压缩到单个提交使您有机会清理混乱的 WIP 提交 并为您要合并的更改提供良好的理由 https coderwall com p qkrmjq git merge squash http
  • 在功能分支上运行测试

    我有一个构建配置 其中包含连接到 git 分支的测试 VCS 根dev 3 个构建步骤和 1 个触发器 这些是我的构建步骤 构建测试 运行测试 构建和部署 我想为分支运行所有这些构建步骤dev但只有其中两个 构建和运行测试 用于分支匹配fe
  • Git 身份验证 - 以新用户身份拉取

    以下命令集可以正常工作 mkdir carboncake cd carboncake git init git remote add origin email protected cdn cgi l email protection rep
  • 如何将 git-svn 与 svn+ssh url 一起使用

    我喜欢在cygwin中使用git svn clone使用我们公司 svn 存储库的命令 这个的网址是svn ssh svn
  • 在 C# 中编写批处理脚本的好方法是什么?

    我想用 C 编写简单的脚本 我通常会使用 bat 或 4NT btm 文件 复制文件 解析文本 询问用户输入等等 相当简单 但在批处理文件中正确执行这些操作确实很困难 例如没有例外 我熟悉像 AxScript 这样的命令行 脚本 包装器 这
  • Windows 上的 git 忽略文件名大小写更改 [重复]

    这个问题在这里已经有答案了 我有一个reactjs应用程序 我正在将所有文件名标准化为小写以符合Nodejs 最佳实践 https devcenter heroku com articles node best practices stic

随机推荐

  • java中的时间同步

    在 for 循环中 我通过检索和处理车辆信息来控制基于模拟步骤的交通模拟器 SUMO 为了确保我的程序 实时 模拟 1 个模拟步骤 1 秒 我想在处理阶段之后让我的程序休眠 直到下一个时间步骤开始 为了获得更好的结果 我根据最初采用的参考时
  • ActionBar 中的 ProgressBar,例如具有刷新功能的 GMail 应用程序

    我想做与 Honeycomb 平板电脑上的 GMail 应用程序相同的事情 单击 刷新 按钮时 该图标将替换为进度条 我怎样才能做到这一点 Thanks 好吧 我尝试了 Cailean 的建议 但它对我不起作用 每次我想将不确定的进度恢复到
  • DOM 更新后的大循环无法及时渲染

    我的页面中有大约 9000 个元素 必须经常重建 这可能需要几秒钟的时间 所以 我制作了一个小的覆盖小部件 用一个覆盖元素Loading 信息 在我重建元素之前 我调用showOverlay 在循环之后我调用hideOverlay 但是循环
  • 如何停止 JShell / Kulla 中的无限循环?

    JShell 是一个 Java REPL 计划与 Java 9 一起发布 但是 它有一个公开测试版 如果我通过键入以下内容在 JShell Kulla 项目 中创建无限循环 gt while true JShell 将永远循环 除了完全退出
  • 在 nextjs 13 上加载页面

    您好 我正在尝试在网站需要时间加载时显示加载页面 因为它是一个相当大的网站 我认为加载屏幕会提供最好的用户体验 但是我似乎无法弄清楚如何让它在 nextjs 13 上工作 我创建了一个简单的功能组件 上面写着加载 并且有将其直接导入到我的l
  • d3.js 超出最大调用堆栈大小错误

    当我尝试布局力导向图时 以下是我收到的错误 我在 Mike Bostock 的 github 页面上读到了这个问题 发现这可能是由于坐标的 NaN 值或在同一点绘制的所有点造成的 我检查了控制台 发现所有点都以相同的 X 和 Y 值绘制 在
  • 根据长度对集合 进行排序

    我的问题与this https stackoverflow com questions 3844721 algorithm to generate all permutation by selecting some or all chara
  • 数据框从宽到长,具有多个变量和 ID R [重复]

    这个问题在这里已经有答案了 我有一个数据框 其中包含参与者对两个文本的判断 假设每个文本都有正确答案和标识符 并且每个文本都被判断多次 set seed 123 wide df data frame participant id LETTE
  • sklearn.* 模块在 0.22 版本中已弃用,并将在 0.24 版本中删除

    我正在将一个软件从 Python 2 7 迁移到 Python 3 出现的一个问题是 sklearn neighbors kde 模块在版本 0 22 中已弃用 并且 将在 0 24 版本中删除 对应的类 函数 应该从 sklearn ne
  • 将计算的 xpage 字段绑定到表单字段

    关于将数据绑定到表单存在很多问题 这很简单 我有一个表单 它使用多个计算字段 这些字段使用 DbLookup 提取数据 以根据用户选择的下拉菜单填充字段 问题是 没有一个计算字段将任何值保存到它所绑定的形式中 表单上保存的唯一数据是手动选择
  • 春季云配置搜索路径

    我正在考虑通过 Spring Cloud Config 实现 12factor 方法来外部化配置 但无法按照我的预期使用 searchPaths 使通配符正常工作 文档http cloud spring io spring cloud co
  • SQL中检查字段是否包含特殊字符

    我们决定使用Nvarchar在某些表中存储一些信息 原因是我们假设我们将有很多特殊字符 因为数据库包含法语和德语数据 提取一些数据后 我们估计完整运行的大小非常巨大 20 TB 现在我们想检查每个表以查找是否找到特殊字符 如果没有 那么我们
  • add_custom_command -- 在重建时更新依赖项列表

    查看上次状态更新 初始条件 代码生成器 生成一组 C 源代码 以一个输入文件作为参数 输入文件可能包含其他输入文件 已经解决了获取输出文件列表 解析输入代码生成文件以获取代码生成输入的完整列表的任务 IE 首次为 add custom co
  • 防止 IIS 通过 ASP.NET 管道提供静态文件

    对我的 css js 图像文件的请求是通过 ASP NET 管道提供的 我认为 IIS 默认情况下会避免这种情况 但我在我的网站上看到了这些请求Application AuthenticateRequest断点 并且不需要实际验证这些请求
  • 在AWS Lambda执行环境上安装第3方库

    我需要为 AWS Lambda 函数安装本机库 使用 RPM 我已经发现这篇博文 https aws amazon com blogs compute nodejs packages in lambda 本机模块部分 但我不知道在哪里编写这
  • 设计WCF数据契约和操作

    我开始设计一个 wcf 服务总线 它现在很小 但会随着我们业务的增长而增长 所以我担心一些日益严重的问题 并尽量不要 YAGNI 太多 这是一个电子商务平台 问题是我对把东西放在哪里犹豫了太多 我将给出一个场景来展示我所有的问题 我们有一个
  • Android:如何使用下载管理器类?

    我想从 url 下载二进制文件 是否可以使用我在这里找到的 Android 下载管理器类下载管理器类 http developer android com reference android app DownloadManager html
  • 在 Clojure 命名空间中排除 java.lang.*

    是否有可能从 Clojure 命名空间中的 java lang 中排除类名 我需要使用像 Byte 和 String 这样的变量 这里 java lang 类名就出现了 也许类似 ns my ns exclude java lang 如果您
  • 何时使用重新编译

    请耐心等待 我无法包含我的 1 000 多行程序 并且描述中有几个问题 所以我正在寻找几种类型的模式 literally just a regular word re search Word arg Varying complex patt
  • 如何重命名大量文件

    我有一个包含这样的文件的目录 a JPG b JPG c JPG 我想做这样的事情 git mv a JPG a jpg 我尝试使用 xargs 和其他工具 但似乎没有任何效果 该解决方案的核心是使用一种工具 方法来自动执行批量重命名 您可