xargs не распознает псевдонимы bash - PullRequest
57 голосов
/ 05 февраля 2009

Я пытаюсь запустить следующую команду:

find . -iname '.#*' -print0 | xargs -0 -L 1 foobar

где "foobar" - это псевдоним или функция, определенная в моем файле .bashrc (в моем случае это функция, которая принимает один параметр). Очевидно, xargs не распознает их как вещи, которые он может запустить. Есть ли умный способ исправить это?

Ответы [ 5 ]

37 голосов
/ 05 февраля 2009

Поскольку псевдонимы знает только ваша интерактивная оболочка, почему бы просто не запустить псевдоним, не отключившись через xargs?

find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done

Если вы уверены, что в именах ваших файлов нет символов новой строки (ick, зачем они?), Вы можете упростить это до

find . -iname '.#*' -print | while read -r i; do foobar "$i"; done

или даже просто find -iname '.#*' | ..., поскольку каталог по умолчанию . и действие по умолчанию -print.

Еще одна альтернатива:

 IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done

говорит Bash, что слова разделяются только на новые строки (по умолчанию: IFS=$' \t\n'). Вы должны быть осторожны с этим, хотя; некоторые сценарии плохо справляются с изменённым $IFS.

10 голосов
/ 19 июля 2010

Используя Bash, вы также можете указать количество аргументов, передаваемых вашему псевдониму (или функции), например:

alias myFuncOrAlias='echo'  # alias defined in your ~/.bashrc, ~/.profile, ...
echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0
echo arg1 arg2 | xargs  bash -cil 'myFuncOrAlias "$@"' arg0
5 голосов
/ 05 февраля 2009

Это не работает, потому что xargs ожидает, что сможет exec программа , заданная в качестве ее параметра.

Поскольку foobar в вашем случае это просто псевдоним или функция bash, программа для выполнения отсутствует.

Хотя он включает в себя запуск bash для каждого файла, возвращаемого find, вы могли бы написать небольшой скрипт оболочки таким образом:

#!/bin/bash
. $(HOME)/.bashrc
func $*

и затем передать имя этого скрипта в качестве параметра xargs

1 голос
/ 05 февраля 2009

Я обычно использую находку так:

find . -iname '' -exec cmd '{}' \;

'{}' будет заменено именем файла и \; необходимо завершить цепочку выполнения. Однако, если это не работает с вашей функцией, вам может потребоваться запустить ее через bash:

find .. |sed -e "s/.*/cmd '&'/"|bash

Find выводит на печать каждый файл в строке, sed просто префиксирует это своей командой, а затем передает его в bash для выполнения. Сначала пропустите | bash, чтобы увидеть, что произойдет.

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

1001 * попробовать *

find . -iname '.#*' -print0 | xargs -0 -L 1 $(foobar)
...