【问题标题】:Git recursive mv filesGit递归mv文件
【发布时间】:2014-05-02 16:00:05
【问题描述】:

我正在尝试将版本号添加到目录中的所有 javascript 文件,以便我们的用户不会缓存对文件的更改。

如何在一个目录中移动多个目录中的所有 Javascript 文件?

带有示例文件结构:

js/
--home/
----main.js
--apps/
----main.js
--handlers.js
--ajax.js

我想做类似git mv -r js/*.js js/*.1.js 的操作,将.1 附加到文件名中。显然 git mv 没有递归标志,所以我想知道我的选择是什么来做类似的事情。

【问题讨论】:

标签: git bash mv


【解决方案1】:

Globstar (bash >=4)

shopt -s globstar # Set the SHell OPTion globstar
for f in **/*.js; do
  git mv "$f" "${f%.js}.$version.js"
done

将所有内容移动到单个目录:

for source in **/*.js; do
  dest="${source%.js}.$version.js"
  dest="$destination/${dest##*/}" # Strip off leading directories and prepend actual destination
  git mv "$source" "$dest"
done

查找

您可以使用find,但几乎相同,因此请将其保存在您需要 Bash 3 或 POSIX sh 可移植性的地方(例如 OS X)。

find . -iname '*.js' -exec sh -c 'for f; do
  git mv "$f" "${f%.js}.$version.js"
done' _ {} +

【讨论】:

  • **.*.js 让它进入一个目录?另外,shoptglobstar 是什么?
  • @bozdoz globstar 只是普通* 的递归版本,写成**shopt -s 将选项设置为 true(bash 中默认为 false),允许使用它。
  • @bozdoz 更新了一种将所有内容移动到单个目的地的方法——我一开始不确定这就是你想要的。
  • 我不需要shoptglobstar。我也将它添加到一个 makefile 中,如下所示:for f in js/**/*.js; do git mv "$$f" "$${f%.js}.$(v).js"; done
猜你喜欢
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 2014-07-13
相关资源
最近更新 更多