2

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

例如 /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。

就目前而言,运行像这样的重命名脚本脚本似乎是我最终要做的。

4

1 回答 1

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

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

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

于 2012-10-16T21:27:16.947 回答