У меня есть скрипт perl (или любой исполняемый файл) E, который возьмет файл foo.xml и напишет файл foo.txt. Я использую кластер Beowulf для запуска E для большого количества XML-файлов, но я бы хотел написать простой сценарий сервера заданий в shell (bash), который не перезаписывает существующие файлы txt.shell scripting: search/replace & check file существуют
В настоящее время я делаю что-то вроде
#!/bin/sh
PATTERN="[A-Z]*0[1-2][a-j]"; # this matches foo in all cases
todo=`ls *.xml | grep $PATTERN -o`;
isdone=`ls *.txt | grep $PATTERN -o`;
whatsleft=todo - isdone; # what's the unix magic?
#tack on the .xml prefix with sed or something
#and then call the job server;
jobserve E "$whatsleft";
, и тогда я не знаю, как получить разницу между $ TODO и $ IsDone. Я бы предпочел использовать sort/uniq для чего-то вроде цикла for с grep внутри, но я не уверен, как это сделать (временные файлы труб?)
В качестве бонусного вопроса есть ли способ сделать искать в bash grep?
Чтобы уточнить/расширить эту проблему:
У меня есть куча программ, которые принимают входные данные от источников, таких как (но не обязательно) данных/{ветвь}/специальный/{шаблон} .xml и писать вывод в другой результаты каталога/special/{branch} - {pattern} .txt (или data/{branch}/intermediate/{pattern} .dat, например). Я хочу проверить свой сценарий оболочки workfarming, если этот файл уже существует.
Таким образом, E преобразует данные/{branch}/special/{pattern} .xml-> results/special/{branch} - {pattern} .dat, например. Я хочу посмотреть на каждый экземпляр ввода и проверить, существует ли выход. Один (по общему признанию, более простой) способ сделать это - просто прикоснуться к файлам * .done рядом с каждым входным файлом и проверить эти результаты, но я бы не стал ими управлять, и иногда задания прерываются неправильно, поэтому я бы не хотел их отмечено.
N.B. Мне еще не нужно проверять параллелизм или блокировать любые файлы.
Так простой, ясный способ решить вышеуказанную проблему (в псевдокоде) может быть
for i in `/bin/ls *.xml`
do
replace xml suffix with txt
if [that file exists]
add to whatsleft list
end
done
, но я искал что-то более общее.
'txtfile = $ {XMLFILE% .xml} .txt' делает замену - как в моем ответе. –
Когда вы говорите «во избежание перезаписи файлов» - нужно ли нам быть совместимым с параллелизмом? Если это так, нам нужно сделать некоторую блокировку. (Если это так ... мы находимся в общей файловой системе? Какой из них имеет правильную семантику для 'flock'?) –
нет понимания параллелизма, без блокировки - это общая файловая система, но это побочный проект на данный момент – johndashen