xargs не распознает псевдонимы удара

Если вы используете .NET 4, просто используйте File.ReadLines , который сделает все для вас. Я подозреваю, что много то же самое, что и ваш, за исключением того, что он также может использовать FileOptions.SequentialScan и более крупный буфер (128 кажется очень маленьким).

60
задан Ian Greenleaf Young 4 February 2009 в 22:12
поделиться

4 ответа

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

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

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

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

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

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

 IFS= 

выразительный Bash, что слова только разделяются на новых строках (значение по умолчанию: IFS=). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным $IFS.

\t\n'). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным $IFS.

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

выразительный Bash, что слова только разделяются на новых строках (значение по умолчанию: IFS=). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным $IFS.

\t\n'). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным $IFS.

37
ответ дан ephemient 7 November 2019 в 14:22
поделиться

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

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

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

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

Находят печать каждым файлом на строке, sed просто префиксы это с Вашей командой, и затем передают его по каналу для избиения за выполнение. Пропустите |bash сначала для наблюдения то, что произойдет.

1
ответ дан Staale 7 November 2019 в 14:22
поделиться

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

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

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

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

и затем передают название того сценария как параметр к xargs

5
ответ дан Alnitak 7 November 2019 в 14:22
поделиться

Используя 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
12
ответ дан 24 November 2019 в 17:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: