bash - 为什么这个变量在查找迭代中没有改变它的值

标签 bash sed find

我试图使用 find 重命名所有文件,但在运行此命令之后...

find . -name '*tablet*' -exec sh -c "new=$(echo {} | sed 's/tablet/mobile/') && mv {} $new" \;

我发现我的文件不见了,将其更改为 echo $new 的值,发现它始终保留第一个文件的名称,因此它基本上将所有文件重命名为具有相同的名称

$ find . -name '*tablet*' -exec sh -c "new=$(echo {} | sed 's/tablet/mobile/') && echo $new" \;
_prev_page.tablet.erb
_prev_page.tablet.erb
_prev_page.tablet.erb
_prev_page.tablet.erb
_prev_page.tablet.erb
_prev_page.tablet.erb
_prev_page.tablet.erb

也尝试更改为export new=...,结果相同

为什么new的值没有改变?

最佳答案

我认为的问题是命令替换由 bash 扩展一次,然后 find 在每次调用中使用结果。我的原因可能是错的。

当我在编写 shell 脚本之前有类似的东西时

#! /bin/bash
old="$1"
new="${1/tablet/mobile}"
if [[ "${old}" != "${new}" ]]; then
    mv "${old}" "${new}"
fi

负责重命名文件,然后我可以从 find 命令调用该脚本

find . -name "*tablet*" -exec /path/to/script '{}' \;

让事情变得更容易解决。

编辑:

哈哈,在对引号进行了一番修改之后,您可以通过将双引号更改为封装命令的单引号来解决这个问题。 $() 是由 shell 命令扩展的。如果按如下方式完成,则命令替换由 exec 调用的 shell 完成。

find . -name "*tablet*" -exec sh -c 'new=$( echo {} | sed "s/tablet/mobile/" ) && mv {} $new' \;

所以问题与扩展命令替换有关,通过将其放在单引号中,我们在每次调用 sh 时强制扩展。

关于bash - 为什么这个变量在查找迭代中没有改变它的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14344902/

相关文章:

git - 如何为 git-flow 别名启用自动完成?

file - linux 中的列聚合

linux - 比较 2 个 Unix 文件并将匹配行输出到一个新文件?

linux - 替换/插入一行到文件末尾

file - 如何将find的结果传递给vim的argadd命令

linux - 我如何通过使用 grep 和 find 命令替换字符串来更新文件的内容

服务器响应中的 jQuery .find()

Linux - 保护环境变量

linux - 如何创建具有多个变量的环境以在 Linux 中运行程序?

linux - 可以期望产生一个 bash 函数吗?