linux - 如何使用 Bash 更改类型为 "find"的文件的扩展名?

标签 linux bash shell unix scripting

<分区>

用户输入他们要查找的文件类型;它存储在 $arg1 中;他们想要更改的文件类型存储为 $arg2。我能够找到我要找的东西,但我不确定如何保持文件名相同,只是更改类型...即,file1.txtfile1.log

find . -type f  -iname "*.$arg1" -exec mv {} \;

最佳答案

启用shell parameter expansions的全部功能,您可以在 exec 操作中调用 bash -c:

find . -type f -iname "*.$arg1" \
    -exec bash -c 'echo mv "$1" "${1/%.*/$1}"' _ {} "$arg2" \;

我们将 {}"$arg2" 作为参数添加到 bash -c,因此它们可以在命令中作为 $0$1${0%.*} 删除扩展名,替换为 $arg2 扩展到的内容。

实际上,该命令只打印它要执行的 mv 命令;要实际重命名文件,必须删除 echo

引号是相关的:bash -c 的参数用单引号括起来,以防止 $0$1 过早展开,并且mvarg2 的两个参数也被引用以处理其中包含空格的文件名。

关于linux - 如何使用 Bash 更改类型为 "find"的文件的扩展名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421969/

相关文章:

linux - 为单个 IP 创建两个虚拟主机

linux - 使用变量作为命令的输入

linux - Docker 容器不给我外壳

ruby - 如何使用 Ruby 编写 shell 脚本?

windows - 有没有办法获取所有已安装程序的安装路径?

bash - 崩溃时自动重启 SH 脚本?

linux - 如何将用户添加到组,如果用户和组在 linux 中都具有相同的名称?

linux - rsync 设置错误组

linux - SED - "Filename too long"- 有没有办法跳过这个错误?

linux - 过滤两个多列的大文件