помогите с помощью xargs передать несколько имен файлов в скрипт - PullRequest
4 голосов
/ 31 августа 2011

Может кто-нибудь показать мне, как правильно использовать xargs?Или, если не xargs, какую команду Unix я должен использовать?

Я хочу ввести более (1) имени файла для ввода <localfile>, третий входной параметр.

Например:

1. use `find` to get list of files
2. use each filename as input to shell script

Использование сценария оболочки:

test.sh <localdir> <localfile> <projectname>

Моя попытка, но не работает:

find /share1/test -name '*.dat' | xargs ./test.sh /staging/data/project/ '{}' projectZ \;

Редактировать: После некоторого ввода извсе и, пытаясь -exec, я обнаружил, что мой ввод имени файла <localfile> с find также дает мне полный путь./path/filename.dat вместо filename.dat.Есть ли способ получить базовое имя из find?Я думаю, что это должен быть отдельный вопрос.

Ответы [ 4 ]

4 голосов
/ 31 августа 2011

Если вы хотите выполнить сценарий оболочки для каждого файла (в отличие от выполнения только один раз для всего списка файлов), вы можете использовать find -exec:

find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ '{}' projectZ \;

Помните:

  • find -exec - для случаев, когда вы хотите выполнить команду для одного файла для каждого файла.
  • xargs вместо этого запускает команду только один раз , используя все файлы в качестве аргументов.
4 голосов
/ 31 августа 2011

Я бы просто использовал find -exec здесь:

% find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ {} projectZ \;

Это вызовет ./test.sh с вашими тремя аргументами один раз для каждого .dat файла в /share1/test.

xargs соберет все эти имена файлов и передаст их в один вызов ./test.sh, который не выглядит как ваше желаемое поведение.

2 голосов
/ 31 августа 2011

xargs добавляет столько файлов, сколько может, в конец командной строки. Вы хотите выполнить скрипт для одного файла за раз или для всех файлов? По одному за раз, используйте exec файла, который выглядит так, как будто вы уже используете синтаксис, и который xargs не использует:

find /share1/test -name '*.dat' -exec ./test.sh /staging/data/project/ '{}' projectZ \;
0 голосов
/ 15 января 2013

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

find /share1/test -name '*.dat' -print0 | xargs -0 -I'{}' ./test.sh /staging/data/project/ '{}' projectZ

При передаче от find до xargs обычно предпочтительнее завершение NULL, я рекомендую добавить параметр -print0 к find.После чего вы должны добавить -0 к xargs, чтобы он ожидал завершенные аргументы NULL.Это обеспечивает правильную обработку имен файлов.Это не POSIX, но считается хорошо поддерживаемым.Вы всегда можете отказаться от параметров завершения NULL, если вашим командам не хватает поддержки.

Запомните, в то время как цель find - поиск файлов, xargs гораздо более универсален.Я часто использую xargs для обработки аргументов без имени файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...