обратная галочка не работает

У меня есть большое количество файлов в структуре каталогов, которые я хочу переименовать.

Имена файлов имеют следующий формат:
"aaaaaa-bbbbbb_cccccc-ddddd_eeeeee-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'`" \;

Но это не работает:

вход:

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)" имеет тот же эффект

Спасибо


person C0ppert0p    schedule 09.04.2012    source источник


Ответы (5)


Скорее всего, оболочка сначала интерпретирует команду внутри обратных кавычек (даже до запуска find). Однако "{}" не будет иметь особого значения до после запуска find. Попробуйте создать функцию оболочки или сценарий bash для своей команды вместо того, чтобы писать ее встроенно. Это должно позволить вам делать более сложные вещи, не беспокоясь о проблемах с экранированием оболочки.

person bta    schedule 09.04.2012

пытаться

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

i.e.

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 в логическом месте.

Надеюсь, это поможет.

person shellter    schedule 09.04.2012

небольшая вариация

$ 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"
person glenn jackman    schedule 10.04.2012

Избегайте обратных кавычек, так как это означает, что вы просите избежать проблем.

Как уже указывалось, вполне вероятно, что обратные кавычки вступят в силу до вызова find.

Используйте $(), который может быть вложен без особых проблем, а затем экранируйте $ в $(command), чтобы он пережил вызов и был передан find. С этого момента (при условии, что find использует оболочку - например, $SHELL - для выполнения вашей команды) все будет работать нормально.

person 0xC0000022L    schedule 10.04.2012

Это может сработать для вас:

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

Если вы хотите увидеть команду cp перед выполнением, просто оставьте последний канал | bash

person potong    schedule 10.04.2012