Рейтинг:0

Ошибка замены строки в команде xargs

флаг tr

Я пытаюсь автоматически создать символические ссылки на каталоги и заменить определенную текстовую строку (foo) исходного имени в имени ссылки (bar). Имя целевых каталогов может содержать пробелы (например, «foo с пробелом»).

Это минимальный пример:

> лс-Q

"фу"
"foo с пробелом"

Я пытаюсь выполнить следующую команду (используя параметр xargs -p для отладки/проверки результата перед его выполнением):

найти . -iname "*foo*" -print0 | xargs -0 -I '{}' -p ln -s {} `echo {} | sed -e s#foo#bar#g

Мой желаемый результат таков:

ln -s 'foo с пробелом' 'bar с пробелом'
ln -s 'фу' 'бар'

Однако замена строки не выполняется. Фактический вывод выглядит следующим образом:

ln -s './foo с пробелом' './foo с пробелом'?...
ln -s ./foo ./foo?...

Если я использую постоянные строки вместо {}, замена строки работает так, как предполагалось:

найти . -iname "*foo*" -print0 | xargs -0 -I '{}' -p ln -s {} `echo "foo" | sed -e s#foo#bar#g`

ln -s './foo с пробелом'?...
ln -s ./foo бар?...

В чем моя ошибка и как исправить вызов команды?

Редактировать: Решение Тильмана Шмидта работает как шарм.

Рейтинг:1
флаг bd

Замена команды

`эхо {} | sed -e s#foo#bar#g`

выполняется только один раз, перед трубопровод, состоящий из найти и xargs команды выполняются. Так сед получает строку {} как ввод и, не находя фу, выводит его без изменений. затем оболочка запускает результирующую командную строку

найти . -iname "*foo*" -print0 | xargs -0 -I '{}' -p ln -s {} {}

Таким образом, подстановка команд здесь не подходит. Попробуйте что-то вроде

найти . -iname "*foo*" -print | при чтении f; do ln -s "$f" "${f//foo/bar}"; сделано

(непроверенный) вместо этого. Обратите внимание, что это не сработает, если у вас есть имена файлов, содержащие символы новой строки.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.