unix/macos - 如何找到所有文件并使用不同的扩展名复制到位

unix/macos - how to find all files and duplicate in place with a different extension

所以我想抓取所有特定文件,然后将它们复制到相同的 folder/location 但具有不同的扩展名。到目前为止,我从另一个问题 Copy all files with a certain extension from all subdirectories:

find . -name \*.js -exec cp {} newDir \;

我想将所有这些 .js 文件复制到 .ts,例如将 functions.js 复制到 functions.ts,无论它在哪里。

更多示例:

a/functions.js
b/test.js
c/another.js
index.js

a/functions.ts
b/test.ts
c/another.ts
index.ts

这里是如何使用 findxargs 分配变量并打开各种命令行选项,

$ find . -name '*.js' | xargs -I {} bash -c 'p="{}"; cp $p newDir/$(basename ${p%.js}.ts)'

使用 xargs -I {} 获取 find 的输出作为 xargs 的输入。使用bash -c执行命令。

这是一个演示:

$ mkdir -p a b c d newDir
$ touch a/1.js b/2.js c/three.js d/something.js
$ find . -name '*.js' | xargs -I {} bash -c 'p="{}"; cp $p newDir/$(basename ${p%.js}.ts)'
$ ls newDir/
1.ts        2.ts        something.ts    three.ts

编辑(问题在初始 post 小时后更改)。要在同一目录中保留副本,请使用相同的 cp 命令并删除 newDirbasename:

$ find . -name '*.js' | xargs -I {} bash -c 'p="{}"; cp $p ${p%.js}.ts'
find . -name \*.js | while read jsfile; do cp "${jsfile}" "${jsfile%.js}.ts"; done
  1. find . -name \*.js 列出所有 .js 个文件
  2. 使用read命令从fine命令的输出中读取每一行。
  3. ${jsfile%.js}表示去掉变量jsfile的后缀.js,例如a/functions.js变为a/functions