Aqui estão algumas abordagens:
-
Se todos os arquivos estiverem no mesmo diretório de destino (
$dir
), isso é trivial:newest=$(ls -1tr $(grep -Hl "$read" "$dir") | tail -n 1)
-
Se você também precisar entrar em subdiretórios:
newest=$(ls -1tr $(find . -type f -exec grep -Hl "$read" {} \;) | tail -n 1)
Ambos os exemplos acima usam tail -n 1
para imprimir apenas a última linha da saída ls
classificada. No entanto, analisar ls
é uma idéia muito ruim e geralmente deve ser evitada. Aqui estão alguns métodos mais complexos, mas mais seguros, que podem lidar com nomes de arquivos arbitrários:
-
Isso usa alguns truques, eu preciso usar a sintaxe
{ }
para capturar a variável (veja aqui ) . OIFS=
e o-r
certificam-se de que podemos lidar com nomes de arquivos estranhos estat
para obter o tempo de modificação do arquivo. O arquivo mais recente é salvo na variável$newest
.mdate=0; fdate=0; newest=$(find . -type f -exec grep -Hl foo {} \; | { while IFS= read -r file; do fdate=$(stat -c %Y "$file"); if [ "$fdate" -gt "$mdate" ]; then latest="$file"; mdate="$fdate"; fi; done; echo "$latest"; })