Como obter o caminho do arquivo mais novo entre o conjunto de arquivos que contém o mesmo ID?

1

Eu quero escrever um script que levará o ID como uma entrada do usuário. Com base nessa entrada, ele procurará nos diretórios para corresponder a um arquivo que contenha o ID fornecido. Agora, o diretório tem mais de 10 arquivos, mas todos contêm o mesmo ID. Então, se eu usar grep , isso só me dará os arquivos na ordem de classificação. Não quero exibir todos os arquivos, exceto o arquivo mais recente no diretório que contém esse id. Suponha que eu tenha arquivos a1 , a2 , a3 , a4 , a5 , a6 , etc. Todos os arquivos têm alguma informação, mas apenas o ID deles é diferente.

Eu tentei grep -lr "$read" | ls -ltr , mas isso processa apenas arquivos em ordem crescente, não atingindo o objetivo completo. Eu quero uma pista / sugestão de como eu trabalharia para renderizar o arquivo mais recente com o caminho.

    
por mahesh 17.02.2014 / 09:18

1 resposta

0

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 ) . O IFS= e o -r certificam-se de que podemos lidar com nomes de arquivos estranhos e stat 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"; 
    })
    
por 17.02.2014 / 16:32