найти -exec с несколькими командами

Ваши два примера кода гарантируют, что они будут иметь одинаковый результат в однопоточных средах, которые .Net не являются, и если MaxResults является полем (а не свойством). Компилятор не может предположить, если вы не используете функции синхронизации, что criteria.MaxResults не изменится в течение вашего цикла. Если это свойство, он не может предположить, что использование свойства не имеет побочных эффектов.

Эрик Липперт совершенно правильно указывает, что он сильно зависит от того, что вы подразумеваете под «компилятором». Компилятор C # -> IL? Или компилятор IL -> машинного кода (JIT)? И он прав, чтобы указать, что JIT вполне может оптимизировать свойство getter, так как он имеет всю информацию (тогда как компилятор C # -> IL не обязательно). Это не изменит ситуацию с несколькими потоками, но, тем не менее, это хорошая точка.

378
задан Andrea Spadaccini 25 February 2011 в 17:18
поделиться

10 ответов

find принимает несколько -exec частей к команде. Например:

find . -name "*.txt" -exec echo {} \; -exec grep banana {} \;

Обратите внимание, что в этом случае вторая команда будет выполняться только в том случае, если первая команда вернется успешно, как упомянуто @Caleb. Если вы хотите, чтобы обе команды выполнялись независимо от их успеха или неудачи, вы можете использовать эту конструкцию:

find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \;
567
ответ дан Alan W. Smith 25 February 2011 в 17:18
поделиться

Другой способ подобен этому:

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 так долго и так сложно, как тебе нужно.

Надеюсь, это поможет.

15
ответ дан Souvik Ghosh 25 February 2011 в 17:18
поделиться

Одно из следующего:

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"' _ {} \;
47
ответ дан Dennis Williamson 25 February 2011 в 17:18
поделиться

Я не знаю, сможете ли вы сделать это с помощью find, но альтернативным решением было бы создать сценарий оболочки и запустить его с помощью find.

lastline.sh:

echo $(tail -1 $1),$1

Сделать сценарий исполняемым

chmod +x lastline.sh

Использовать find:

find . -name "*.txt" -exec ./lastline.sh {} \;
7
ответ дан Andrea Spadaccini 25 February 2011 в 17:18
поделиться

Есть более простой способ:

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 ...)"
8
ответ дан Camilo Martin 25 February 2011 в 17:18
поделиться

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" \;

4
ответ дан Eric Duruisseau 25 February 2011 в 17:18
поделиться

Благодаря Камило Мартину я смог ответить на связанный вопрос:

То, что я хотел сделать, это

find ... -exec zcat {} | wc -l \;

, который не работал. Тем не менее,

find ... | while read -r file; do echo "$file: `zcat $file | wc -l`"; done

работает, так что спасибо!

4
ответ дан Greg Dougherty 25 February 2011 в 17:18
поделиться

должен использовать 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 ' ' '/'
1
ответ дан smapira 25 February 2011 в 17:18
поделиться

find+xargs ответ.

пример ниже находок весь .html файлы и создает копию с .BAK добавленное расширение (например, 1.html> 1.html.BAK).

команда Single с несколькими заполнителями

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 указывает, что входные параметры разделяются от пустого указателя.

0
ответ дан 22 November 2019 в 23:43
поделиться

Расширяя ответ @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
0
ответ дан 22 November 2019 в 23:43
поделиться
Другие вопросы по тегам:

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