Nano Hash - криптовалюты, майнинг, программирование

Итерация по списку файлов с двух сторон

У меня есть следующий скрипт bash

#!/bin/bash 


for i in `ls /file-directory/ | grep -v static-backup | grep -v fileGroup1 | grep -v fileGroup2`
 do
 echo $i
 rsync --delete -avz --size-only --exclude "$i/stuff1" --exclude "$i/stuff2" --exclude "$i/stuff3" --exclude "$i/stuff4" --exclude "$i/stuff5" --exclude "$i/stuff6" /file-directory/$i otherServer:/file-directory/ && echo " exit code: " $?" $i" || echo " exit code: " $?" $i"
 done

Сценарий выполняет итерацию по файловому каталогу и синхронизирует его подкаталоги, исключая определенные файловые группы и части каталогов этих файловых групп. Я хотел бы, чтобы этот сценарий порождал два задания rsync, одно из которых начинается в верхней части каталога, а другое — в нижней. Они будут повторяться в противоположных направлениях и встречаться посередине.

Это относительно просто сделать с обычным подсчетом циклов, и это не будет сложно в чем-то вроде python (вы можете просто сохранить количество каталогов как переменную, а затем выполнить итерацию, используя эту переменную). Как я могу сделать что-то подобное в bash?

07.09.2018

  • Bash имеет встроенный цикл подсчета for. См. цикл for в стиле C (Bash Hackers Wiki). 07.09.2018
  • grep -v -e a -e b -e c имеет тот же результат, что и grep -v a | grep -v b | grep -v c, но примерно в три раза быстрее, потому что он сканирует ввод только один раз и ему не нужно порождать трех дочерних элементов. 07.09.2018
  • Кроме того, я предполагаю, что вы намерены запустить два процесса rsync параллельно. Вам следует взглянуть на параллель Gnu, а не пытаться создать что-то свое. 07.09.2018

Ответы:


1

Вы можете использовать & в процессе от bash до fork. или даже петля. Я уверен, что есть несколько способов добиться этого, но вот один из них.

Псевдокод.

Получить список файлов в двух отдельных массивах так, чтобы каждый из них содержал половину списка (для четных).
Для нечетных файлов второй массив будет содержать еще один файл.
Перебрать первый массив и разветвить процесс, используя &< br> Перебрать второй массив и разветвить второй процесс, используя &

Код

#!/bin/bash
dir_len=$(ls /file-directory/ |wc -l|awk '{print $NF}')
midpoint=$(($dir_len / 2))

array1=()
array2=()
count=0

#Loop through files and divide contents into two arrays  
for i in $(ls /file-directory/)
do
  count=$(($count + 1))
  if [ $count -le $midpoint ] ; then
    array1+=($i)
  elif [[ $count -gt $midpoint && $count -le $dir_len ]] ; then
    array2+=($i)
  fi
done

#Loop through first array and fork     
for i in "${array1[@]}"
do
  echo $i
  #your rsync command here
done&

#Loop through second array and fork
for j in "${array2[@]}"
do
  echo $j
  #your rsync command here
done &  

Примечание:
& является необязательным во втором цикле for, так как вы можете запустить его на переднем плане, так как есть только два процесса.
Кроме того, вы можете захотеть усилить сценарий для нежелательных файлов или если папка пуста.

Редактировать.

В зависимости от типа файлов, которые вам нужно rsync, обратитесь к этой ссылке для вдохновения вместо использования «ls /folder_name/».

https://unix.stackexchange.com/questions/9496/looping-through-files-with-spaces-in-the-names

07.09.2018
  • for i in $(ls /file-directory/) прерывается, если какое-либо имя файла содержит символ в IFS или новую строку. 08.09.2018
  • Я согласен, это не комплексное решение, а способ начать работу. OP может обратиться к этой ссылке, чтобы узнать, как работать со специальными файлами. unix. stackexchange.com/questions/9496/ 08.09.2018
  • синтаксический анализ вывода ls в большинстве случаев является плохой идеей. глобусы оболочки обычно могут обеспечивать ту же функциональность более безопасно и надежно, например. for i in /file-directory/* 08.09.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..