Linux / Cygwin递归复制文件更改扩展名

时间:2012-10-16 21:00:52

标签: linux find rsync xargs cp

我正在寻找一种递归查找扩展名为X( .js)的文件的方法,并在扩展名为Y( .ts)的同一目录中制作该文件的副本。

e.g。 /foo/bar/foobar.js - > /foo/bar/foobar.js和/foo/bar/foobar.ts

/foo/bar.js - > /foo/bar.js和/foo/bar.ts等等

我的尽职调查: 我在考虑使用find& xargs& cp和大括号扩展(cp foobar.{js,ts})但是xargs使用大括号来表示从xargs传递的文件列表。这让我感到难过,因为我刚刚发现了支撑膨胀/替换的棒棒糖。

我觉得必须有一个单线解决方案,但我很难想出一个。

我找到了执行任务的想法:将所需目录复制到新目录,然后将此目录与新目录合并;以递归方式在每个目录中运行重命名脚本;使用rsync复制;使用find,xargs和cpio。

目前看来,运行像this这样的重命名脚本脚本是我最终要做的。

1 个答案:

答案 0 :(得分:7)

find . -name "*.js" -exec bash -c 'name="{}"; cp "$name" "${name%.js}.ts"' \;

使用find,您可以使用-exec选项直接对您找到的文件执行命令;你不需要通过xargs管道。它接受命令名后跟命令的参数,后跟一个参数;,您必须将其转义以避免shell解释它。 find将使用找到的文件替换命令名称或参数中出现的{}

为了调用一个替换了适当结尾的命令,你可以采用多种方法,但一个简单的方法就是使用Bash的parameter expansion。您需要定义一个包含名称的shell参数(在本例中,我创造性地选择了name={}),然后您可以在其上使用参数扩展。 ${variable%suffix}suffix的值中剥离$variable;然后我在.ts添加到最后,并且有我正在寻找的名称。