Наличие некоторого использования проблемы “находит - должностное лицо {} +”

Я использую, Идут. Это - скомпилированный язык, межплатформенный, с простотой программирования динамического языка и поддержкой параллелизма и коммуникации.

Я не возвращаюсь к Python, так как это очень забавно для разработки с Движением.

http://golang.org/
https://github.com/languages/Go

Здесь у Вас есть простая программа, которая использовала аргументы в той команде:

package main

import (
  "fmt"
  "flag"
)

func main() {
  fmt.Println("Arguments: ", flag.Args())
}

http://play.golang.org/p/1dpUT11-cc

4
11.06.2013, 22:31
4 ответа
find . -iname "*.extension" -exec sh -c '
  exec <command> "$@" <additional parameters>' sh {} +
3
27.01.2020, 20:54
  • 1
    Спасибо, это работало на меня! Я могу попросить объяснение того, что происходит здесь? –  ialm 11.06.2013, 23:45
  • 2
    Это работало на небольшое подмножество файлов, которые я тестировал с, но теперь, когда я пробую это на съемочной площадке 100 000 файлов, я "установлен: Слишком много аргументов". ошибки. Я считал то использование {} + было быстрее, чем {} \;, но я предполагаю, что не могу использовать его! Спасибо за Ваш ответ, хотя! –  ialm 12.06.2013, 01:05
  • 3
    @ialm, это - ограничение csh (его builtins имеют предел (1000 на том, найденном на Ubuntu) на количестве аргументов), оболочка, которой необходимо использовать в сценарии, названном <command>. Вы могли, по крайней мере, использовать tcsh (который должен быть обратно совместимым с csh), но лучше всего должен избежать csh вообще для сценариев. –  Stéphane Chazelas 12.06.2013, 13:38
  • 4
    Нет никакого доказательства csh, включен. –  jlliagre 13.06.2013, 11:13
  • 5
    @StephaneChazelas - Я спросил это просьба о ком-то объяснить вышеупомянутый код: unix.stackexchange.com/questions/93324/how-does-this-code-work –  slm♦ 02.10.2013, 21:26

С + это собирается перечислить несколько имен файлов, разделенных пробелами вместо {} (и это будет длинный список, так как у Вас есть 100 000 файлов), а не просто единственное имя файла. При этом, {} требуется прибыть в конце команды.

Посмотрите find(1) страница справочника под -exec command {} +.

1
27.01.2020, 20:54
  • 1
    Это не допустимый аргумент. Нет никакой технической причины, которая запрещает запаздывание аргументов. Вычисление командной строки было бы почти тем же. Единственная причина состоит в том, что это - глупое ограничение обоих find и xargs. –  Hauke Laging 11.06.2013, 23:00
  • 2
    @HaukeLaging: Поднимите его с авторами. Я просто заявляю, что. –  bahamat 11.06.2013, 23:03
  • 3
    Если нет проблемы языка (и я неправильно понимаю Вас), затем, Вы не заявляете, что. Это: "Из-за проектного решения {} должен прибыть в конец". Вы говорите (в моем понимании): "Поскольку {} расширяется до многих файлов {} должен прибыть в конец. И это просто не верно. –  Hauke Laging 11.06.2013, 23:26
  • 4
    Там не является никакими пробелами, входящими в изображение там. {} заменяется списком аргументов, переданных команде, это - все. пробелы в командной строке оболочки используются для разделения аргумента командам, но здесь, find не запускает оболочки. –  Stéphane Chazelas 11.06.2013, 23:36
  • 5
    Моя страница справочника на -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). Проблемой является названная команда, требует дополнительных аргументов (дополнительные параметры). Добавление их переполняет предельного продвижения к "слишком многим ошибкам аргументов". Сценарий, который я предлагаю, разделил созданный список параметров в двух частях и выполняет две команды вместо одной на блок, настолько добавляющие дополнительные аргументы не показывают проблему.

1
27.01.2020, 20:54
  • 1
    Спасибо за ответ! Я решил быть терпеливым и использовать медленнее \; опция и задание должны быть сделаны через несколько дней. Если я когда-нибудь должен выполнять задание снова, я попробую это! –  ialm 12.06.2013, 19:16
  • 2
    Ответ, обновленный для объяснения, почему я предполагаю это, перестал работать со сценарием Stephane. –  jlliagre 13.06.2013, 11:12

Можно использовать этот сценарий:

#! /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 {} +

Название команды не должно быть длиннее, чем название сценария (только, чтобы быть уверенным).

0
27.01.2020, 20:54

Теги

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