Обновление объединения двух каталогов

Вместо определения отдельных переменных для каждой строки определите массив. Используйте ${ar[123]}для доступа к элементу 123 массива arи ${#ar[@]}для получения размера массива.

data_link=(
    "https://example.com/target1.html"
    "https://example.com/target2.html"
    "https://example.com/target3.html"
    "https://example.com/target4.html"
)
user_agent=(
    "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A403 Safari/602.1"
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0.3 Safari/604.5.6"
    "Mozilla/5.0 (Windows 7; ) Gecko/geckotrail Firefox/firefoxversion"
)

wget --user-agent="${user_agent[RANDOM % ${#user_agent[@]}]}" "${data_link[RANDOM % ${#data_link[@]}]}"
0
17.12.2019, 21:03
2 ответа

Простое решение для достижения требуемого состояния. Вы можете использовать следующие 2 команды:

rsync -auv b/ c/
rsync -av a/ c/

PROS:работает рекурсивно для всех под-дерева каталогов.

МИНУСЫ:в период времени с момента запуска первой команды и до окончания выполнения второй команды некоторые более новые файлы из "b/" имеющие аналог в "a/" могут быть временно помещены в "c /", пока они не будут заменены правильными файлами из "a/" второй командой.

Итак, решение хорошее, только если:

  • вам нужен конечный результат и вам не важно состояние "c/" во время процедуры синхронизации;
  • если вы не заботитесь о том, чтобы некоторые файлы копировались несколько раз.
0
28.01.2020, 03:00

Вы можете использовать Makefileдля начала.

Я немного протестировал его с помощью GNU Make 4.2.1. Я не знаю, будет ли это работать с другими версиями Make. Я знаю, что это не удастся, если в aили bесть подкаталог. Возможно есть и другие подводные камни.

.PHONY: all

SRCA = a
SRCB = b

DEST = c

# create list of targets from wildcard lists of both sources
TARGETS = $(patsubst $(SRCA)/%,$(DEST)/%,$(wildcard $(SRCA)/*)) $(patsubst $(SRCB)/%,$(DEST)/%,$(wildcard $(SRCB)/*)) 

all: $(TARGETS)

# GNU Make prefers the first matching pattern rule because both rules lead to the same stem length 
$(DEST)/%:$(SRCA)/%
    cp "$<" "$@"

# alternative pattern rule if the first one does not match
$(DEST)/%:$(SRCB)/%
    cp "$<" "$@"
0
28.01.2020, 03:00

Теги

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