xargs echo `echo {} |sed 's / pattern / replace /' `не работает, но для каждого цикла работает - PullRequest
0 голосов
/ 21 октября 2018

Я хочу сделать эквивалент:

for i in `ls -1`; do echo $i | mv $i `sed 's/profile/account/'`; done

с xargs

ls -1 | xargs -I{} mv {} `echo {} | sed 's/profile/account/'`

Но sed после канала в обратных тиках игнорируется.Кто-нибудь знает, почему это так?

Редактировать: Подробнее

Корень проблемы в том, чтобы просто переименовать файлы в непосредственно заданной замене шаблона (здесь замените profile на account, однако это решается с помощью for inЗацикливайте файлы.

Я задаю вопрос: почему не работает следующее:

ls -1 | xargs -I{} mv {} `echo {} | sed 's/profile/account/'`

Почему часть

`echo {} | sed 's/profile/account/'`

не возвращаетзаменил имя файла, но исходное имя файла. Это как если бы | не работал внутри обратных черт.

Чтобы написать проблему по-другому:

Если у меня есть список, как в файле с именемlist.txt

profile1.txt
profile2.txt 

И хотите сгенерировать

account1.txt
account2.txt 

При работе с каждой отдельной строкой отдельно, чтобы я мог запустить команду на ней.

cat list.txt | xargs -I{} echo `echo {} | sed 's/profile/account/'`

Почему команда возвращает:

profile1.txt
profile2.txt 

Вместо смены профиля на учетную запись?

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

Согласитесь с комментариями выше относительно использования расширения оболочки глобуса, а не ls -1, или простого решения, использующего prename, тем не менее, упражнение интересно также в том случае, если вы хотите передать канал другим выводам (например, find или(*).

Ниже это делается с помощью вызова мини-скриптлета, аргументом которого является каждая строка с xargs подачей, с использованием bash-isms замены var (обратите внимание на суженный ls ..., чтобы иметь возможность перезапускать их безошибки):

ls -1 *profile* | xargs -l1 bash -xc 'echo mv "$1" "${1/profile/account}"' --

Примечание выше - пробный прогон , удалите echo, чтобы фактически сделать это.

0 голосов
/ 04 ноября 2018

В примере:

cat list.txt | xargs -I{} echo `echo {} | sed 's/profile/account/'`

xargs не интерполирует {} внутри обратных тиков.

Итак:

`echo {} | sed 's/profile/account/'`

Отголосок буквального {}.Последующий sed не меняет {}.

`echo {} | sed 's/profile/account/'`

Вернет: {}

Что дает:

cat list.txt | xargs -I{} echo {}
0 голосов
/ 21 октября 2018

Это может работать для вас (параллельно GNU):

parallel 'old={}; new=${old/profile/account}; echo mv $old $new' ::: *

Удалить echo после проверки.

...