Preciso escrever um script que execute alguns executáveis em um diretório de acordo com a data da última modificação. O mais antigo deve ser executado primeiro. Como eu faço isso?
Isso é o que eu fiz até agora
for f in ./jobqueue/*; #accessing the queue
do
chmod +x * # giving executable permission for the files
$f # running the executables
done
Responder1
Globbings de shell são expandidos em ordem lexical por padrão. Se você precisar de uma ordem de classificação diferente, precisará de um shell que suporte a especificação da ordem, zsh
o que provavelmente é uma coisa boa, pois você já está usando zsh
a sintaxe lá (sem citar $f
).
for f in ./jobqueue/*(.NOm); do
chmod +x $f
$f
done
A (.NOm)
parte são zsh
os qualificadores globais. .
apenas para arquivos regulares, N
para expandir para nada se não houver arquivo correspondente em vez de relatar um erro (como se a nullglob
opção estivesse habilitada), Om
para order (maiúsculas para ordem reversa) no mmomento da odificação.
Com o shell GNU ( bash
) e com GNU ls
, o equivalente seria:
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
Responder2
Desde que seus nomes de arquivos não contenham espaços ou tabulações ou novas linhas ou ?
ou *
ou [
e que o diretório não contenha subdiretórios, você pode tentar algo como
for f in $(ls -tr ./jobqueue/) ; do
chmod +x ./jobqueue/$f
./jobqueue/$f
done