Выполнить итерации по n файлам?

Диспетчеры пакетов, которые Вы цитируете, являются действительно просто выбором фронтендов к базовой упаковочной системе. Например, конфетка является фронтендом к об/мин, и другие существуют (умный, застежка-молния, apt4rpm, и так далее). Точно так же средняя основанная на DPKG система имеет два или три диспетчера пакетов по умолчанию (Синаптический, Способность, склонный - добираются, dselect, и так далее). Я не знаю достаточно о Pacman для комментария там.

Фронтенд - действительно не все что интересный - существует степень разрешения зависимости, которое это должно обработать, но действительно "трудная" часть управления пакетом прибывает из базового формата пакета.

Снова, я не могу прокомментировать Pacman, но между об/мин и DPKG, Это - об/мин, который имеет более жесткое задание - можно определить чрезвычайно сложные отношения в RPM-пакете, который должен так или иначе обработать сопоставитель, и единственная ошибка в определениях пакета может вызвать страдание по линии. DPKG является намного более простым форматом, что касается информации о зависимостях, так как можно только определить две вещи - имена пакета и версии - тогда как с об/мин можно сделать сложные вещи как имеющие версию символы в зависимостях и так далее.

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

8
12.07.2012, 15:55
4 ответа

A bash метод, с помощью специальных функций массива; вероятно, переводимый к zsh с некоторой модификацией:

image_files=(*.svg) # use your own glob expression
n=200               # number of files per command line; adjust to taste
for ((i=0; i < ${#image_files[@]}; i+=n)); do
        montage -size 256x256 "${image_files[@]:i:n}" output-"$i".png
done
6
27.01.2020, 20:10
  • 1
    я нашел этот бит сценариев удара, также очень расширяем. я просто использовал его для перемещения некоторых файлов (16 файлов на каталог), и это работало над первой попыткой, которая была определенным удивлением.спасибо. –  ixtmixilix 13.08.2012, 03:28

Можно использовать xargs для этого; к сожалению, это не должно возможно комбинировать-I (для instering в середину командной строки) и-L (для ограничения количества файлов для единственного вызова к исполняемому файлу). Поэтому я создал эту командную строку как пример (но остерегайтесь специальных символов в именах файлов, они не поддерживаются):

 ls . | \
   xargs -n 100 echo | \
   (a=1; 
    while read args; do 
     echo montage -size 256x256 $args output-$a.png;
     a=$((a+1)); 
    done
   )

Удалите echo если Вы хотите действительно выполнить команду.

Протесты:

  • имена файлов не могут содержать пробелы или другие специальные символы
  • последняя строка монтажа могла бы иметь меньше чем 100 файлов в ней

Обновление:

Это - соответствие для цикла, который (я надеюсь), решает проблему с пробелами в именах файлов:

a=0
b=0
lst=
for f in *; do 
  a=$((a+1))
  lst="$lst '$f'"
  if test $a -ge 100; then 
    eval echo montage --args $lst target-$b.png
    b=$((b+1))
    a=0
    lst=
  fi 
done

Обновление 2: решение для Python, которое должно быть неуязвимо для специальных символов в именах файлов

#!/usr/bin/env python
# iterate.py

"""Usage: 
%prog <number per call> <file pattern> <command prefix> -- <command postfix>
e.g.  %prog 100 "DSC01*.jpg.svg" montage -size 256x256 -- output-%i.png """

import sys,subprocess,glob,os

if len(sys.argv) < 5: 
  print __doc__.replace("%prog", os.path.basename(sys.argv[0]))
  sys.exit(1)

def chunks(l, n): 
  for i in xrange(0, len(l), n): yield l[i:i+n]

num, pattern, args = int(sys.argv[1]), sys.argv[2], sys.argv[3:]
files, idx = glob.glob(pattern), args.index("--")
before, after = args[0:idx], args[idx+1:]

for idx,chunk in enumerate(chunks(files,num)):
  subprocess.call( before + chunk + [s.replace("%i",str(idx)) for s in after] )
5
27.01.2020, 20:10
  • 1
    Если Вы собираетесь рекомендовать использовать ls в канале для парсинга его вывода необходимо также предупредить о многих опасностях сделать так заметно и вначале удостовериться, что люди видят его. –  jw013 12.07.2012, 18:49
  • 2
    @jw013 +1 Да, это - определенно беспокойство. Однако его регистрация позволила мне предположить, что он использовал фотографии, непосредственно импортированные из цифрового фотоаппарата, которые не содержат специальных символов. Как Вы предложили бы заняться той проблемой? –  daniel kullmann 12.07.2012, 21:00
  • 3
    Да, похоже, что имена файлов относительно мягки (следовательно никакой downvote). Однако OP действительно не указал то, вне чего они похожи *.svg (который является, почему я отправил комментарий к вопросу, спрашивающему). В наиболее общем случае, где необходимо обработать все имена файлов, необходимо было бы обратиться для окружения globbing и массивов или find -print0 | xargs -0 конструкции. См. мой ответ для примера первого. –  jw013 12.07.2012, 22:35
  • 4
    @jw013 Ваш ответ действительно хорош! Я никогда не прилагал усилия, чтобы изучить, как массивы работают в ударе. Возможно, я должен. –  daniel kullmann 13.07.2012, 10:58

Вот версия с помощью xargs, это безопасно для любого имени файла, но требует, чтобы временный файл сохранил количество. Скорректируйте '-n 100' для корректировки сколько файлов на монтаж. Можно также подкачать "printf" с, "находят-print0", но удостоверяются, что он не находит "count.temp".

echo 1 >count.temp
printf "%s\0" *.svg | xargs -0 -n 100 sh -c '
    a=`cat count.temp`
    montage --blah "$@" output-"$a".png
    let a=a+1
    echo "$a" >count.temp
    '
rm count.temp
2
27.01.2020, 20:10

С Параллелью GNU можно сделать:

parallel -N200 montage -size 256x256 {} output{#}.png ::: *.svg

Это, конечно, безопасно для файлов со специальными символами (как можно обычно ожидать Параллели GNU).

Минимальная установка

Если Вы просто должны найти что-либо подобное и не имеете, 'делают' установленными (возможно, системой является старая или Microsoft Windows):

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
mv parallel sem dir-in-your-$PATH/bin/

Посмотрите вводное видео для краткого введения: https://www.youtube.com/playlist? list=PL284C9FF2488BC6D1 или по http://tinyogg.com/watch/TORaR/ и http://tinyogg.com/watch/hfxKj/

2
27.01.2020, 20:10

Теги

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