Encontre o arquivo mais novo. Várias restrições de tipo de arquivo

7

Eu quero escrever um comando que me forneça o arquivo mais recente em um diretório recursivamente . Mas essa não é minha única limitação. Os arquivos devem ser um arquivo mp3 ou jpg . ( sem distinção entre maiúsculas e minúsculas ) Eu só preciso da data de criação desse novo arquivo. Se possível eu quero formatado assim: 30-12-2014 (então: dia-mês-ano )

Este é o caminho que eu tenho atualmente:

find .  -name '*.mp3' -or -name '*.JPG'   -printf "%TD \n" | sort -rn | head -n 1

Mas isso não funciona bem. Eu só recebo JPGs e a data não está formatada.

    
por user2815780 30.07.2014 / 17:22

4 respostas

5

Algo como isso deve funcionar:

find . \( -iname "*.mp3" -o -iname "*.jpg" \) -printf '%TY%Tm%Td %TT %p\n' | sort -r

Isto deve encontrar os arquivos que (sem distinção entre maiúsculas e minúsculas) localizam arquivos terminados em mp3 ou jpg, imprimir a hora da modificação e, em seguida, ordenar em ordem inversa.

Parece mostrar os dois tipos de arquivo quando você o executa efetivamente como dois comandos:

( find . -iname "*.mp3" -printf '%TY%Tm%Td %TT %p\n' ; find . -iname "*.jpg" -printf '%TY%Tm%Td %TT %p\n' ) | sort -r
    
por 30.07.2014 / 17:49
4

com zsh :

setopt extendedglob
zmodload zsh/stat
zstat -F %F +mtime -- **/(#i)*.(mp3|jpg)(Om[1])

Note que é baseado no tempo última modificação , o tempo de criação (o que quer que isso signifique) geralmente não está prontamente disponível no Linux.

Não considera arquivos ocultos. Se você quiser, adicione o qualificador D globbing acima.

    
por 30.07.2014 / 17:36
2

Veja também o seguinte:

find . -type f -mtime -1 \( -name '*.mp3' -o -name '*.jpg' \) -printf '%AY-%Am-%Ad %P \n'
    
por 30.07.2014 / 17:52
0

Você especificou -ou, que precisa ser -o, como outros corrigiram. Você também precisa de parênteses eu acho (correção no meu post original). Eu recomendaria usar %T@ para o especificador de formato (segundos desde 1970), que é mais limpo de classificar; então você pode convertê-lo usando

date --date="@'find . \( -iname "*.mp3" -o -iname "*.jpg" \) -printf '%T@\n' | sort -rn | head -n1'" 

ou qualquer outra coisa. Você também pode colocar qualquer formato de data desejado usando + .

    
por 30.07.2014 / 18:21