我正在寻找一种递归查找扩展名为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这样的重命名脚本脚本是我最终要做的。
答案 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
添加到最后,并且有我正在寻找的名称。