Если вы используете .NET 4, просто используйте File.ReadLines
, который сделает все для вас. Я подозреваю, что много то же самое, что и ваш, за исключением того, что он также может использовать FileOptions.SequentialScan
и более крупный буфер (128 кажется очень маленьким).
Так как только Ваша интерактивная оболочка знает о псевдонимах, почему не только выполняет псевдоним, не раскошеливаясь до 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, что слова только разделяются на новых строках (значение по умолчанию:
\t\n'IFS=). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным
$IFS
.$IFS
. \n'; for i in `find -iname '.#*'`; do foobar "$i"; done
выразительный Bash, что слова только разделяются на новых строках (значение по умолчанию: IFS=). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным
$IFS
.
$IFS
. Я обычно использую, находят как это:
find . -iname '' -exec cmd '{}' \;
' {}' будет заменен именем файла, и \; необходимо для завершения цепочки выполнения. Однако, если это не работает с Вашей функцией, Вы, возможно, должны были бы выполнить ее через удар:
find .. |sed -e "s/.*/cmd '&'/"|bash
Находят печать каждым файлом на строке, sed просто префиксы это с Вашей командой, и затем передают его по каналу для избиения за выполнение. Пропустите |bash сначала для наблюдения то, что произойдет.
Это не работает, потому что xargs
ожидает мочь к exec
программа , данная как ее параметр.
С тех пор foobar
в Вашем случае просто bash
псевдоним или функция, там не программа для выполнения.
, Хотя это включает запуск bash
для каждого файла, возвращенного find
, Вы могли записать маленький сценарий оболочки таким образом:
#!/bin/bash
. $(HOME)/.bashrc
func $*
и затем передают название того сценария как параметр к xargs
Используя 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