0

我要重命名的目录结构中有大量文件。

文件名采用以下格式:
“aaaaaa-bbbbbb_cccccc-ddddd_eeeee-fffff-ggggg-hhhhh.psd”

我希望它们采用这种格式:
“Aaaaaa-Bbbbbb_Cccccc-Ddddd_Eeeee-Fffff-Ggggg-Hhhhh.psd

单个 find 和 sed 例程应该将它们转换为正确的格式:

find . -name "*psd" -exec sh -c "echo 'cp '{} `echo {} | sed 's/\([_-][a-z]\)\([A-Z]*\)/\2\U\1/g'`" \;

但它不起作用:

输入:

辅助或自动/抽象渲染/辅助或自动_abstract-render_tiny-bubbles3.psd

输出:

cp ./Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd ./Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd

如果我删除反引号并插入分号,sed 例程就可以工作。

find . -name "*bubbles3.psd" -exec sh -c "echo 'cp '{} ; echo {} | sed 's/\([_-][a-z]\([A-Z]*\)/\2\U\1/g'" \;

cp ./Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd
./Assisted-Or-Auto/Abstract-Render/assisted-Or-Auto_Abstract-Render_Tiny-Bubbles3.psd

所以,由于某种原因,反引号没有做它应该做的事情。关于如何解决此问题的任何想法?仅供参考用“ $(cmd) ”符号替换反引号具有相同的效果

谢谢

4

5 回答 5

2

最有可能的是,shell 首先解释反引号内的命令(甚至在运行之前find)。但是,“ ”运行{}之前不会有任何特殊含义。尝试为您的命令创建一个 shell 函数或 bash 脚本,而不是内联编写它。这应该可以让你做更复杂的事情,而不必担心 shell 转义问题。 find

于 2012-04-09T23:56:33.367 回答
0

尝试

sed 's/\([/_-][a-z]\)\([A-Z]*\)/\2\U\1/g'

IE

echo $'./Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd' \
| sed 's/\([/_-][a-z]\)\([A-Z]*\)/\2\U\1/g'

输出

./Assisted-Or-Auto/Abstract-Render/Assisted-Or-Auto_Abstract-Render_Tiny-Bubbles3.psd

我只添加了“/”来匹配最初的小写单词部分(我的 sed 说mismatched \( .. \)所以我在逻辑位置添加了 1。

我希望这有帮助。

于 2012-04-09T23:55:03.007 回答
0

这可能对您有用:

find . -name "*bubbles3.psd" | 
sed 'h;s/\(^\|[/_-]\)./\U&/g;H;g;s/^/cp -v /;s/\n/ /' |
bash

如果您想在cp执行之前查看命令,只需离开最后一个管道| bash

于 2012-04-10T01:33:12.730 回答
0

避免使用反引号,因为这意味着您要求逃避问题。

正如已经指出的那样,反引号很可能在调用find.

Use $(),它可以嵌套而没有太多的逃避麻烦,然后逃避$in$(command)以便它能够在调用中幸存并被传递给find. 从那时起(假设find使用 shell - 例如$SHELL- 执行您的命令),一切都会正常工作。

于 2012-04-10T01:11:17.400 回答
0

细微的变化

$ input=Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd
$ sed 's!\(/\|-\|_\)[a-z]!\U&!g' <<< "$input"
Assisted-Or-Auto/Abstract-Render/Assisted-Or-Auto_Abstract-Render_Tiny-Bubbles3.psd

可以使用 GNU sed 变得更干净一些

$ sed 's!(/|-|_)[a-z]!\U&!g' <<< "$input"
于 2012-04-10T00:20:57.093 回答