LINUX.ORG.RU

sed в двойном echo

 


0

1

Доброго времени суток, есть каталог DIR, в нем другие каталоги вида:
DIR/STRING1_some_text01
DIR/STRING1_some_text01/STRING1_some_text10
DIR/STRING1_some_text02/STRING1_some_text11/STRING1_some_text20
.....
DIR/STRING1_some_text0N/STRING1_other_text1N/....../...../STRING1_some_textMN

Пытаюсь одной командой в названиях каталогов заменить STRING1 на STRING2.

Сама команда:
find DIR/ -type d -name '*STRING1*' | xargs -I VAR echo mv «VAR» `echo «VAR»|sed 's/STRING1/STRING2/g'`

Вывод команды, например для первого каталога, получается такой:
mv DIR/STRING1_some_test01 DIR/STRING1_some_test01
А нужно:
mv DIR/STRING1_some_test01 DIR/STRING2_some_test01

Как правильно загнать sed во второй echo?

p.s. лишнее echo для того чтобы проверить, что вывод корректный.


Не проще ли будет сделать это через prename?

find ... -exec prename 's/STRING1/STRING2/g' {} +

AITap ★★★★★ ()
Ответ на: комментарий от kenji

УМВР

       ${parameter/pattern/string}
              Pattern  substitution.  The pattern is expanded to produce a pattern just as in pathname expansion.  Parameter is
              expanded and the longest match of pattern against its value is replaced with string.  If pattern begins  with  /,
              all  matches  of pattern are replaced with string.  Normally only the first match is replaced.  If pattern begins
              with #, it must match at the beginning of the expanded value of parameter.  If pattern begins  with  %,  it  must
              match at the end of the expanded value of parameter.  If string is null, matches of pattern are deleted and the /
              following pattern may be omitted.  If parameter is @ or *, the substitution operation is applied  to  each  posi‐
              tional parameter in turn, and the expansion is the resultant list.  If parameter is an array variable subscripted
              with @ or *, the substitution operation is applied to each member of the array in turn, and the expansion is  the
              resultant list.

man 1 bash

emulek ()
Ответ на: комментарий от kenji

ну если ты не осилил засунуть sed в mv, сделай наоборот, типа

find … sed -r 'h; s/STRING1/STRIG2/g; G; s/(.*)\n(.*)/svn mv "\2" "\1"/p'

если то что надо, добавь «e» к последней s///p

emulek ()

Господа, задействовал «высшие» силы. В итоге вот так:

export IFS=$(echo -en "\n\b");for i in `find trunk -type d -name '*DIR1*'`; do echo "svn mv $i `echo $i|sed "s/STRING1/STRING2/g"`"; done; unset IFS

kenji ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.