Como encontrar um arquivo mais recente modificado no diretório e subdir?

3

Como encontrar o último arquivo modificado pelo comando "find" no diretório e subdir? Eu preciso levar apenas um arquivo.

    
por Aleksandr 21.02.2011 / 08:52

2 respostas

1

No Linux, você pode usar

find . -type f -printf "%TY-%Tm-%Td %TT %p\n" | sort | tail -n 1

Isso listará todos os arquivos ( -type f ) e os imprimirá com timestamps, depois classificará e imprimirá apenas o último.

Se você não quiser imprimir o timestamp também, use

find . -type f -printf "%TY-%Tm-%Td %TT %p\n" | sort | tail -n 1 | cut -d " " -f 3-
    
por 21.02.2011 / 09:04
0

Como a classificação falha se a lista de arquivos é muito grande, aqui está outra solução:

ls -lRU --time-style=long-iso "$PWD"/* | awk 'BEGIN {\
    cont=0; newd=20000101; \
} { \
    gsub(/-/,"",$6); if (substr($0,0,1)=="/") \
    { \
        pat=substr($0,0,length($0)-1)"/"; $6="" \
    }; \
    if( $6 ~ /^[0-9]+$/) { \
        if ( $6 > newd ) { \
            newd=$6; \
            newf=$8; \
            for(i=9; i<=NF; i++) { \
                newf=newf $i; \
            } \
            newf=pat newf; \
        }; \
        count++; \
    } \
} END { \
    print "newest date: ", newd, "\nFile:", newf, "\nTotal compared: ", count \
}' 

Basta colar no bash.

Eu peguei este código da resposta do @Br-Beco em Como posso encontrar o arquivo mais antigo em uma árvore de diretórios e modifiquei o código para mostrar o arquivo NEWEST. Para explicação, siga o link.

Se você quer um one-liner, retire o \ + newline e você terá

ls -lRU --time-style=long-iso "$PWD"/* | awk 'BEGIN { cont=0; newd=20000101;} {gsub(/-/,"",$6); if (substr($0,0,1)=="/"){pat=substr($0,0,length($0)-1)"/"; $6=""};if( $6 ~ /^[0-9]+$/) {if ( $6 > newd ) {newd=$6;newf=$8;for(i=9; i<=NF; i++) {newf=newf $i;}newf=pat newf;};count++;}} END {print "newest date: ", newd, "\nFile:", newf, "\nTotal compared: ", count}' 

Ainda não encontrei uma maneira de mostrar apenas as datas do FILE, não as DIRs. Tentei

ls --classify |grep -v /$

que deve simplesmente remover todos os dirs da saída ls. mas isso de alguma forma quebrou o código.

    
por 13.03.2018 / 17:53

Tags