xargs repl_str 不扩展第二个占位符

xargs repl_str 不扩展第二个占位符

我想重命名一些文件并将其他文件排除到目录中。我试过

find . -mindepth 1 -maxdepth 1 ! -name 000-default.conf ! -name default-ssl.conf -print0 |
xargs -0 -I {} sudo mv -- {} $(echo {} | sed 's/local.conf/local.example.com.conf/')

但这是行不通的。

我认为mv命令的第二个参数没有正确扩展。

答案1

$(...)在调用 xargs 之前,shell 正在评估该部分。你可能会尝试的是这样的:

xargs -0 -I {} bash -c 'mv {} $(echo {} | sed "s/local.conf/local.example.com.conf/")'

你可以避免 sed

xargs -0 -I {} bash -c 'f="{}"; mv "{}" "${f/local.conf/local.example.com.conf}"'

另请参阅该rename命令(如果有)。

答案2

xargs你也可以不带, 类似的东西来写

find . -mindepth 1 -maxdepth 1 ! -name 000-default.conf ! -name default-ssl.conf -exec sh -c '
sudo mv -- "$0" "$(echo "$0" | sed "s/local.conf/local.example.com.conf/")"

' {} \;

使用“find ... -exec sh -c '...' sh {} +”的 find 命令如何工作?更多细节。

相关内容