Мне нужно написать скрипт, который будет запускать некоторые исполняемые файлы в каталоге в соответствии с последней датой изменения. Сначала должен запускаться самый старый. Как это сделать?
Вот что я сделал на данный момент
for f in ./jobqueue/*; #accessing the queue
do
chmod +x * # giving executable permission for the files
$f # running the executables
done
решение1
Подстановки Shell по умолчанию расширяются в лексическом порядке. Если вам нужен другой порядок сортировки, вам понадобится оболочка, которая поддерживает указание порядка, например , zsh
что, вероятно, хорошо, поскольку вы уже используете zsh
там синтаксис (не заключая в кавычки $f
).
for f in ./jobqueue/*(.NOm); do
chmod +x $f
$f
done
Эта (.NOm)
часть — zsh
квалификаторы подстановки. .
Только для обычных файлов, N
чтобы ничего не расширять, если нет соответствующего файла, вместо сообщения об ошибке (как если бы опция nullglob
была включена), Om
чтобы oупорядочить (в верхнем регистре для обратного порядка) во mвремя модификации.
С оболочкой GNU ( bash
) и с GNU ls
эквивалент будет таким:
eval "files=($(ls -drt --quoting-style=shell ./jobqueue/* 2> /dev/null))"
for f in "${files[@]}"
[ -f "$f" ] && [ ! -L "$f" ] || continue
chmod +x -- "$f"
"$f"
done
решение2
При условии, что имена ваших файлов не содержат пробелов, табуляции, символов новой строки или ?
или *
или [
и что каталог не содержит подкаталогов, вы можете попробовать что-то вроде
for f in $(ls -tr ./jobqueue/) ; do
chmod +x ./jobqueue/$f
./jobqueue/$f
done