Ваши два примера кода гарантируют, что они будут иметь одинаковый результат в однопоточных средах, которые .Net не являются, и если MaxResults
является полем (а не свойством). Компилятор не может предположить, если вы не используете функции синхронизации, что criteria.MaxResults
не изменится в течение вашего цикла. Если это свойство, он не может предположить, что использование свойства не имеет побочных эффектов.
Эрик Липперт совершенно правильно указывает, что он сильно зависит от того, что вы подразумеваете под «компилятором». Компилятор C # -> IL? Или компилятор IL -> машинного кода (JIT)? И он прав, чтобы указать, что JIT вполне может оптимизировать свойство getter, так как он имеет всю информацию (тогда как компилятор C # -> IL не обязательно). Это не изменит ситуацию с несколькими потоками, но, тем не менее, это хорошая точка.
find
принимает несколько -exec
частей к команде. Например:
find . -name "*.txt" -exec echo {} \; -exec grep banana {} \;
Обратите внимание, что в этом случае вторая команда будет выполняться только в том случае, если первая команда вернется успешно, как упомянуто @Caleb. Если вы хотите, чтобы обе команды выполнялись независимо от их успеха или неудачи, вы можете использовать эту конструкцию:
find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \;
Другой способ подобен этому:
multiple_cmd() {
tail -n1 $1;
ls $1
};
export -f multiple_cmd;
find *.txt -exec bash -c 'multiple_cmd "[110]"' {} \;
в одну строку
multiple_cmd() { tail -1 $1; ls $1 }; export -f multiple_cmd; find *.txt -exec bash -c 'multiple_cmd "[111]"' {} \;
multiple_cmd()
» - это функция export -f multiple_cmd
"- экспортирует его таким образом, чтобы его мог увидеть любой другой подоболочек find *.txt -exec bash -c 'multiple_cmd "[114]"' {} \;
"- найдите, что будет выполнять функцию на вашем примере Таким образом, можно создать multip_cmd так долго и так сложно, как тебе нужно.
Надеюсь, это поможет.
Одно из следующего:
find *.txt -exec awk 'END {print [110] "," FILENAME}' {} \;
find *.txt -exec sh -c 'echo "$(tail -n 1 "$1"),$1"' _ {} \;
find *.txt -exec sh -c 'echo "$(sed -n "\$p" "$1"),$1"' _ {} \;
Я не знаю, сможете ли вы сделать это с помощью find, но альтернативным решением было бы создать сценарий оболочки и запустить его с помощью find.
lastline.sh:
echo $(tail -1 $1),$1
Сделать сценарий исполняемым
chmod +x lastline.sh
Использовать find
:
find . -name "*.txt" -exec ./lastline.sh {} \;
Есть более простой способ:
find ... | while read -r file; do
echo "look at my $file, my $file is amazing";
done
В качестве альтернативы:
while read -r file; do
echo "look at my $file, my $file is amazing";
done <<< "$(find ...)"
1-й ответ Дениса - это решение проблемы. Но на самом деле это больше не находка с несколькими командами только в одном exec, как предполагает заголовок. Чтобы ответить на один exec несколькими командами, нам нужно искать что-то еще для разрешения. Вот пример:
Сохраните последние 10000 строк .log файлов, которые были изменены за последние 7 дней, используя 1 команду exec с использованием нескольких ссылок {}
1), посмотрите, что команда будет do для каких файлов:
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "echo tail -10000 {} \> fictmp; echo cat fictmp \> {} " \;
2) Do it: (обратите внимание, не нужно больше \ ", но только"> ")
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;
Благодаря Камило Мартину я смог ответить на связанный вопрос:
То, что я хотел сделать, это
find ... -exec zcat {} | wc -l \;
, который не работал. Тем не менее,
find ... | while read -r file; do echo "$file: `zcat $file | wc -l`"; done
работает, так что спасибо!
должен использовать xargs:)
find *.txt -type f -exec tail -1 {} \; | xargs -ICONSTANT echo $(pwd),CONSTANT
еще один (работает на OSX)
find *.txt -type f -exec echo ,$(PWD) {} + -exec tail -1 {} + | tr ' ' '/'
find+xargs
ответ.
пример ниже находок весь .html
файлы и создает копию с .BAK
добавленное расширение (например, 1.html
> 1.html.BAK
).
find . -iname "*.html" -print0 | xargs -0 -I {} cp -- "{}" "{}.BAK"
find . -iname "*.html" -print0 | xargs -0 -I {} echo "cp -- {} {}.BAK ; echo {} >> /tmp/log.txt" | sh
# if you need to do anything bash-specific then pipe to bash instead of sh
Эта команда будет также работать с файлами, которые запускаются с дефиса или содержат пробелы такой как -my file.html
благодаря заключению в кавычки параметра и --
после cp
, который сигнализирует к [1 110] конец параметров и начало фактических имен файлов.
<час>
-print0
каналы результаты с разделителями пустого байта.
для [1 124] xargs
-I {}
параметр определяет{}
как заполнителя; можно использовать, какой бы ни заполнитель Вам нравится;-0
указывает, что входные параметры разделяются от пустого указателя.
Расширяя ответ @Tinker,
В моем случае, я должен был сделать command | command | command
внутренняя часть -exec
для печати и имени файла и найденного текста в файлах, содержащих определенный текст.
я смог сделать это с:
find . -name config -type f \( -exec grep "bitbucket" {} \; -a -exec echo {} \; \)
результат:
url = git@bitbucket.org:a/a.git
./a/.git/config
url = git@bitbucket.org:b/b.git
./b/.git/config
url = git@bitbucket.org:c/c.git
./c/.git/config