4

使用bash递归改变文件的扩展名

 3 years ago
source link: https://www.myfreax.com/recursively-change-file-extensions-in-bash/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

当需要大量改变文件扩展名的时候会非常有用,这情况可能很少遇到。但是在调试测试的时候就非常有用。

在本文我们将说明如何使用bash的find参数-exec,mv,rename命令递归改变文件的扩展名。-exec顾名思义就是要执行命令的意思。

使用find -exec与mv命令递归改变文件扩展名

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +

比如:我们要查找src目录下所有.spec.ts 文件并更改扩展名

find ./src -name "*.spec.ts" -type f bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +
./src/users/users.controller.spec.ts
./src/auth/auth.service.spec.ts
./src/auth/auth.controller.spec.ts
./src/roles/roles.controller.spec.ts
./src/roles/roles.service.spec.ts
./src/shared/prisma.service.spec.ts
./src/app.controller.spec.ts
./src/permissions/permissions.controller.spec.ts
./src/permissions/permissions.service.spec.ts
  • '{}'是源文件名,包行相对与查找位置目录./src/auth/auth.service.spec.ts,之所以加上单引号是因为shell会解释{},正常情况下{}在shell中意味着创建一个数组array
  • 使用+形式调用会返回非零值作为退出状态,即find返回非零退出状态。 如果发现遇到错误立即退出
  • bash -c 执行指定的命令
  • 'mv "$1" "${1%.t1}".t2' 这是一个mv命令,它接受两个参数第一个参数是$1,即传递来的- '{}'
  • ${1%.t1}将$1解构,路径部分赋值给1%,这里1%就是./src/auth/auth.service

使用find -exec与rename命令递归改变文件扩展名

安装rename在ubuntu和debian

sudo apt install rename

安装rename在Centos和RedHat

sudo dnf install rename
\
find . -name '*.t1' -exec rename .t1 .t2 {} +
find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' +

废话不想写了,直接ctrl+c/v。你看懂就可以


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK