Executando um programa de acordo com a data da última modificação

Executando um programa de acordo com a data da última modificação

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, zsho que provavelmente é uma coisa boa, pois você já está usando zsha sintaxe lá (sem citar $f).

for f in  ./jobqueue/*(.NOm); do
  chmod +x $f
  $f
done

A (.NOm)parte são zshos qualificadores globais. .apenas para arquivos regulares, Npara expandir para nada se não houver arquivo correspondente em vez de relatar um erro (como se a nullglobopção estivesse habilitada), Ompara 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

informação relacionada