Ordenar arquivos por hora de modificação

8

Eu vi muitas perguntas e respostas aqui usando uma construção ao longo das linhas de

list_dir='ls -t /path/to/dir/'
for i in $list_dir; do

ou

ls -t | while read i; do

Agora, eu sei que você não deve usar o ls em scripts porque ele quebra facilmente; mas não consigo encontrar uma maneira melhor de operar em arquivos na ordem da última modificação para a mais recente modificação (ou vice-versa).

Eu posso usar algo como:

find . -type f -printf '%T@ %p\n' | sort -n | cut -d ' ' -f 2- | while read i; do...

... mas isso ainda vai quebrar com todos os arquivos que têm novas linhas em seus nomes, e é muito mais feio para arrancar. Existe uma maneira melhor?

    
por evilsoup 27.05.2013 / 17:58

2 respostas

8

"Não use ls em scripts" é um problema com POSIX ls "only"; para o GNU ls, consulte --quoting-style= .

A classificação do GNU resolve o problema com --zero-terminated .

Se for compatível, você pode usar find ... -exec para passar um nome de arquivo de cada vez para um script que faz o escape. Se pelo menos o bash estiver disponível:

start cmd:> testfunc () { echo "${1//$'\n'/\n}"; }
start cmd:> testfunc a$'\n'b
a\nb
    
por 27.05.2013 / 18:34
4

A maneira mais fácil é usar o zsh. O qualificador glob om ordena as partidas em ordem cronológica inversa; use Om para ordem cronológica.

for x in /path/to/dir/*(Nom); do …

O qualificador N glob faz com que o padrão seja expandido para uma lista vazia, se o diretório estiver vazio. Faça este *(DNom) para corresponder aos arquivos de ponto.

    
por 28.05.2013 / 00:46