2014-07-07 65 views
1

我试图用find和sed重命名一些目录,但切换基于目录名称。使用查找和sed替换重命名目录

例子目录名:

rabbit_stand_a_e 
rabbit_stand_a_ne 

我希望这些改变为:

rabbit_a_stand_e 
rabbit_a_stand_ne 

,所以我想基本上是由分裂_和开关$ 2和大约$ 3

我试着几件事情,但不能得到任何工作,这是我现在在哪里。

find . -type d -execdir mv {} `echo {} | sed -E 's/rabbit_([a-z]+)_([abc])_/rabbit_\2_\1_/'` \; 

此误差与

mv: cannot move ‘rabbit_stand_a_e’ to a subdirectory of itself, ‘rabbit_stand_a_e/rabbit_stand_a_e’ 
+1

,并学会这样调试问题通过选择1个代表文件名,而不是使用'find',使用'回声rabbit_stand_a_e | sed -E'/....//'看你的问题在哪里。在这种情况下,你可以意识到'mv'需要和源以及目标参数。无论如何...祝你好运! – shellter

+0

嗯,我以为我给了两个,'mv {} \'echo .....'{}成为当前的 – Rob

+0

我的sed工作正常,它是独立的,就像你建议'echo rabbit_stand_a_w | sed -E's/rabbit _([az] +)_([abc])_/rabbit_ \ 2_ \ 1 _ /''所以我必须错过使用-exec或mv – Rob

回答

1

问题从当find确实取代为{}参数时,你的壳运行子shell(括在反引号命令的一部分)与茎。

在运行给定命令之前,对所有子壳体进行评估之前的。这意味着您最终会运行您的echo {} | sed ...'命令,然后{}被替换为一个文件名,这意味着您实际上会回显字符串"{}"并将其管道输入sed。由于您的sed模式不匹配"{}",它只是返回{}不变,留给你这一点:

find . -type d -execdir mv {} {} 

现在,当find运行它取代的{}两次出现给定目录名称,因此,您的错误信息对尝试将目录移入自己。

解决这个问题的最简单的方法可能是解释整个命令bash -c,并在参数中传递{}来砸:

find . -type d -execdir bash -c 'mv $1 `echo $1 | sed -E "s/rabbit_([a-z]+)_([abc])_/rabbit_\2_\1_/"`' -- {} \; 

我觉得应该有与xargs这样做一个简单的方法,但目前我对此并不明显。如果我稍后想到它,我会更新我的答案(或者如果有其他人想要与意见相吻合的评论)。


相关阅读:Subshell arguments in -exec parameter for find(1)

+0

感谢您的回答,完美。我能够通过for循环获得我需要的行为 – Rob