2013-03-25 3 views
0

Короче говоря, у меня есть кусок сценария, который выглядит следующим образом:

cd ${1} # via command-line argument 
find . -name "output*.txt" | xargs cat ${1} | grep -v ${filter} > temp.txt 

я в основном получил в этот момент покупки здания строка find ... в командной строке, затем вставив ее в мой скрипт, затем добавив команду cd, чтобы упростить повторное использование этого скрипта в оболочке, которая будет запускать этот скрипт в большом наборе каталогов. Так или иначе ...

Проблема заключается в том, что cd и xargs использовать один и тот же ${1} переменная, то makese

Я знаю, что я могу упасть ${1} аргумент от xargs, и я, вероятно, можно переписать команду find в не нужно xargs вообще, но мой вопрос остается:

есть ли способ, чтобы «сбросить» ${1} после того как я использую его для cd так, что xargs не

ответ

2

Я не знаком с версией xargs, которая использует ${1} как строка замены по умолчанию, но должно работать:

find . -name "output*.txt" | xargs -I '{}' cat '{}' | grep -v ${filter} > temp.txt 
0

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

Я смоделировал обертку у вас и имел ту же проблему, что и путь, переданный как $ {1}, к моей функции был выбран xargs ...... но это как работает оболочка, на самом деле оболочка просто заменить/развернуть все переменные и вещи, чтобы сделать команды завершения перед выполнением

утилита ARNT закодированы, чтобы позаботиться об этом сами по себе, они просто не делают, что ...... пример:

echo * ; 

здесь оболочка будет расширяться * и заменять ее всеми именами файлов в текущем каталоге и передавать их в echo ut в качестве аргумента @ перед выполнением команды echo *

Аналогично в вашем случае оболочка расширяет $ {1} до значения пути, которое вы передали перед выполнением команды ..... вот почему вы получили то, что вы имел.

Решение: Вы могли бы просто использовать фигурные скобки (пустые, конечно) или лучше просто бросить их ....... это работает хорошо для меня .....

find . -iname "*${filename}*" | xargs ls -l | more commands ....; 

надеюсь, что это помогает.

0

Использование найти + xargs страдает от сепаратора проблемы https://en.wikipedia.org/wiki/Xargs#The_separator_problem

Вот решение, которое не имеет этой проблемы.Он использует GNU Parallel:

find . -name "output*.txt" | parallel cat {} | grep -v ${filter} > temp.txt 

Это занимает буквально 10 секунд, чтобы установить GNU Parallel:

wget pi.dk/3 -qO - | sh -x 

Смотреть интро видео, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Смежные вопросы