Linux / Cygwinrecursion复制文件更改扩展

我正在寻找一种方式来recursion地find扩展名为X( .js)的文件,并在扩展名为Y( .ts) 的同一目录中创build该文件的副本

例如/foo/bar/foobar.js – > /foo/bar/foobar.js和/foo/bar/foobar.ts

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

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

我觉得必须有一个单线解决scheme,但我正在努力想出一个。

我发现了执行这个任务的想法:将所需的内容复制到一个新的目录,然后将这个目录与新的目录合并; recursion地在每个目录中运行一个重命名脚本; 使用rsync复制; 使用find,xargs和cpio。

现在看来,像这样运行一个重命名脚本脚本是我最终要做的。

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

使用find ,你可以直接在你找到的文件上执行命令,通过使用-exec选项; 你不需要通过xargs管道。 它接受命令后接命令的参数,后跟一个参数; ,你必须逃避,以避免壳解释它。 find将会在命令名或参数中找到找到的文件来替换任何{}出现。

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