我试图使用 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/