Хорошо, запустите этот скрипт с шаблоном как аргумент и если больше чем одно соответствие файлов он удалит самое старое, например:
$ ksh dtof.sh ?? # this will delete the oldest two-character file
Сценарий:
for i in "$@"; do
if [ ! "$oldest" ]; then
oldest="$i"
continue
fi
if [ "$i" -ot "$oldest" ]; then
oldest="$i"
reap="$i"
else
reap="$oldest"
fi
done
[ "$reap" ] && rm "$reap"
Это возможно и действительно происходит в действительности. Используйте файл блокировки для предотвращения этой ситуации. Пример, от упомянутой страницы:
if mkdir /var/lock/mylock; then
echo "Locking succeeded" >&2
else
echo "Lock failed - exit" >&2
exit 1
fi
# ... program code ...
rmdir /var/lock/mylock
Два экземпляра Вашего сценария могут, конечно, взаимодействовать таким образом, заставляя команду работать дважды. Это называют состоянием состязания.
Один способ избежать этого состояния состязания состоял бы в том, если бы каждый экземпляр захватил свой входной файл путем перемещения его в другой каталог. Перемещение файла (в той же файловой системе) является атомарным. Перемещение входных файлов не может быть желательным, и это уже становится немного сложным.
mkdir staging-$$ making-$$
for input in folder/*; do
name=${x#folder/}
staging=staging-$$/$name
output=making-$$/$name
destination=done/$name
if mv -- "$input" "$staging" 2>/dev/null; then
bin/myProgram "$staging" >"$output"
mv -- "$output" "$destination"
mv -- "$staging" "$input"
fi
done
Простым способом обработать файлы в параллели с помощью широко доступного инструмента является GNU, делают, с помощью -j
флаг для параллельного выполнения. Вот make-файл для этой задачи (не забудьте использовать вкладки для расположения с отступом команд):
all: $(patsubst folder/%,done/%,$(wildcard folder/*))
done/%: folder/%
./bin/myProgram $< >$@.tmp
mv $@.tmp $@
Выполненный make -j 3
выполнять 3 экземпляра параллельно.
У меня есть чувство, что Вы действительно пытаетесь выполнить несколько заданий параллельно и что файл блокировки является просто средством для конца.
Если у Вас есть Параллель GNU, http://www.gnu.org/software/parallel/ установил Вас, может сделать это:
parallel ./bin/myProgram ::: ./folder/*
Это выполнит myProgram на каждом ядре параллельно.
Можно установить Параллель GNU просто:
wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
Посмотрите вводные видео для Параллели GNU для узнавания больше: https://www.youtube.com/playlist? list=PL284C9FF2488BC6D1
Проблема с блокировкой состоит в том, что Вам нужен метод, который создает блокировку, которая непрерываема (иногда названный atomar). Поскольку Chris имеет, записал в его ответе mkdir
такая непрерываемая операция (создающий файл, не такая операция).
Существует также высокоуровневая команда - usally скрыта в procmail
пакет: lockfile
. Та команда имеет некоторые хорошие функции и может легко использоваться в Ваших собственных сценариях без потребности "изобрести велосипед" (например, запись Вашей собственной функции, которая блокирует на основе создания каталога).