Я использую, Идут. Это - скомпилированный язык, межплатформенный, с простотой программирования динамического языка и поддержкой параллелизма и коммуникации.
Я не возвращаюсь к Python, так как это очень забавно для разработки с Движением.
http://golang.org/
https://github.com/languages/Go
Здесь у Вас есть простая программа, которая использовала аргументы в той команде:
package main
import (
"fmt"
"flag"
)
func main() {
fmt.Println("Arguments: ", flag.Args())
}
find . -iname "*.extension" -exec sh -c '
exec <command> "$@" <additional parameters>' sh {} +
С +
это собирается перечислить несколько имен файлов, разделенных пробелами вместо {}
(и это будет длинный список, так как у Вас есть 100 000 файлов), а не просто единственное имя файла. При этом, {}
требуется прибыть в конце команды.
Посмотрите find(1)
страница справочника под -exec command {} +
.
find
и xargs
.
– Hauke Laging
11.06.2013, 23:00
{}
должен прибыть в конец". Вы говорите (в моем понимании): "Поскольку {}
расширяется до многих файлов {}
должен прибыть в конец. И это просто не верно.
– Hauke Laging
11.06.2013, 23:26
{}
заменяется списком аргументов, переданных команде, это - все. пробелы в командной строке оболочки используются для разделения аргумента командам, но здесь, find
не запускает оболочки.
– Stéphane Chazelas
11.06.2013, 23:36
-exec comman {} +
состояния Only one instance of
{}' позволяется в рамках команды'. но ничто, о где {}
должен быть помещен. Но при тестировании команды это действительно требует, чтобы я поместил {}
в конце. Странный.
– Lii
12.04.2014, 21:33
Принятие всех каталогов и файлов имеет регулярные имена, т.е. не содержащий пробелы, новые строки или подобный, это должно работать даже с огромным количеством файлов:
find . -iname "*.extension" -exec sh -c '
command="<command>"
additionalParameters="<additional parameters>"
h=$(($#/2))
cmd="$command "
for i in $(seq 1 $h);do
cmd="$cmd $(eval echo \$$i) "
done
cmd="$cmd $additionalParameters"
$cmd
shift $h
$command "$@" $additionalParameters' sh {} +
Объяснение:
При использовании +
пунктуация, найдите сборки командой как можно больше. Существует два включенные ограничения, максимальное количество позволенных аргументов (должен быть 128k на Гну/Linux), и максимальный размер списка аргументов (должны быть 2 МБ на Гну/Linux). Проблемой является названная команда, требует дополнительных аргументов (дополнительные параметры). Добавление их переполняет предельного продвижения к "слишком многим ошибкам аргументов". Сценарий, который я предлагаю, разделил созданный список параметров в двух частях и выполняет две команды вместо одной на блок, настолько добавляющие дополнительные аргументы не показывают проблему.
\;
опция и задание должны быть сделаны через несколько дней. Если я когда-нибудь должен выполнять задание снова, я попробую это!
– ialm
12.06.2013, 19:16
Можно использовать этот сценарий:
#! /bin/bash
cmd=echo
test $# -gt 2 || exit 2
num_trailing_args="$1"
[[ $num_trailing_args =~ ^(0|[1-9][0-9]*)$ ]] ||
{ echo "Illegal first argument ('${num_trailing_args}'); aborting"; exit 2; }
test $# -lt $((num_trailing_args+2)) &&
{ echo "Too few arguments; aborting"; exit 2; }
shift
trailing_args=()
for((i=0;i<num_trailing_args;i++)); do
trailing_args[i]="$1"
shift
done
"$cmd" "$@" "${trailing_args[@]}"
и затем используйте
find ... -exec args_change_script.sh 3 t1 t2 t3 {} +
Название команды не должно быть длиннее, чем название сценария (только, чтобы быть уверенным).
{} +
было быстрее, чем{} \;
, но я предполагаю, что не могу использовать его! Спасибо за Ваш ответ, хотя! – ialm 12.06.2013, 01:05csh
(его builtins имеют предел (1000 на том, найденном на Ubuntu) на количестве аргументов), оболочка, которой необходимо использовать в сценарии, названном<command>
. Вы могли, по крайней мере, использоватьtcsh
(который должен быть обратно совместимым сcsh
), но лучше всего должен избежатьcsh
вообще для сценариев. – Stéphane Chazelas 12.06.2013, 13:38