2

我试图重命名所有文件,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变化?

4

1 回答 1

2

我认为的问题是命令替换由 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 时进行扩展。

于 2013-01-15T19:14:47.607 回答