Acessa o último arquivo (alfabeticamente) em um diretório

3

Estou tentando abrir um arquivo com o vim a partir da linha de comando, o arquivo está em um diretório cheio de arquivos gerados automaticamente que são prefixados com um registro de data e hora. Como não conheço os timestamps da minha cabeça, gostaria apenas de abrir o mais recente no diretório (também o último da lista em ordem alfabética).

vim ./my_dir/<last_item>

Existe uma maneira de fazer isso?

    
por Lee Quarella 09.12.2011 / 15:27

4 respostas

3

Este é realmente um trabalho para zsh.

vim my_dir/*(om[1])

Os bits entre parênteses são qualificadores da glob. O * before é um padrão regular de glob, por exemplo, se você quisesse considerar apenas os arquivos de log, você poderia usar *.log . O qualificador o glob altera a ordem em que as correspondências são classificadas; om significa classificar por hora de modificação, mais recente primeiro. O qualificador [ glob significa retornar apenas algumas das correspondências: [1] retorna a primeira correspondência, [2,4] retorna as próximas três, [-2,-1] retorna as duas últimas e assim por diante. Se os arquivos tiverem nomes que começam com seu registro de data e hora, *([1]) será suficiente.

Em outros shells, não há uma boa maneira de escolher o arquivo mais recente. Se os nomes dos seus arquivos não contiverem caracteres não imprimíveis ou novas linhas, você poderá usar

vim "$(ls -t mydir | head -n 1)"

Se você quiser escolher o primeiro ou o último arquivo com base no nome, há um método totalmente confiável e portátil, que é um pouco detalhado para a linha de comando, mas que pode ser reparado em scripts.

set -- mydir/*
first_file_name=$1
eval "last_file_name=\${$#}"
    
por 09.12.2011 / 21:29
1

Isso funciona para mim:

$ ls -rt | tail -1 | xargs vim

Mas você pode ter um diretório como a última entrada e, nesse caso, talvez queira filtrar diretórios:

$ ls -rt | grep -v "^d" | tail -1 | xargs vim
    
por 09.12.2011 / 15:54
0

Se você estiver dentro do my_dir:

vim $(ls -rt | tail -1)
    
por 09.12.2011 / 15:45
0

Eu acho que você está procurando por isso.

[centos@centos temp]$ for i in 'seq 100'; do touch $i; done

[centos@centos temp]$ ls -t1 | head -1
100


[centos@centos temp]$ vim /.my_dir/$(ls -t1  | head -1)

Mas a classificação depende inteiramente do seu nome de arquivo.

    
por 09.12.2011 / 15:49