cd no último diretório alfanumérico

2

Eu tenho este conteúdo do diretório:

Comovocêpodever,osnomesdosdiretóriossãoapenastimestamps-emgeral,quandoeusouodiretóriodenívelsuperior,geralmentedesejoabrirodiretóriomaisrecente,queéomaiorvalordetimestamp,oquesignificaquedeveserclassificadoporúltimo(certo?).

Existeumaboamaneiradeacessarrapidamenteoúltimodiretório?Possosuporqueelesserãoclassificadosportimestamppelosistemaoperacional?Casocontrário,ojeitosujodefazerissoseriacopiarovalordomaiortimestampeentãorodar"$ cd 1453775108178".

    
por Alexander Mills 26.01.2016 / 03:31

4 respostas

5

O comando ls e curingas, como * listam nomes de arquivos em pedidos lexicográficos. Para nomes de arquivos que consistem apenas de dígitos, isso corresponde à ordem numérica somente se todos os nomes de arquivos tiverem o mesmo número de dígitos. Seus nomes de arquivos parecem ser milissegundos desde a época; contanto que os tempos estejam entre 2001-09-09 01:46:40 e 2286-11-20 17: 46: 39.999, a ordem lexicográfica é boa para você.

Em zsh , você pode usar o qualificador de glob [-1] para fazer o último jogo.

cd *([-1])

Isso pode ser refinado de várias maneiras, como

  • cd *(/[-1]) para garantir que apenas diretórios sejam correspondidos (no caso de existirem outros tipos de arquivos).
  • cd *(-/[-1]) para incluir também links simbólicos para diretórios.
  • cd <->([-1]) para garantir que apenas os nomes que consistem apenas em dígitos¹ sejam correspondidos.
  • cd <->(/n[-1]) para classificar esses nomes em ordem numérica em vez de lexicográfica (por exemplo, 10 classificado após 9 em vez de apenas 1 ).

Outra abordagem no zsh é fazer uso da conclusão. Isso é mais ou menos simples, dependendo das configurações atuais de conclusão. Se você definir a glob_complete opção (que eu faço) e vincular reverse-menu-complete para uma chave, digamos Shift + Tab , que pode ser feito com o seguinte código no seu .zshrc :

setopt glob_complete
bindkey '\e\t' reverse-menu-complete

então você pode digitar cd * Deslocar + Tab e o * será substituído pela última correspondência.

Outros shells não têm essa funcionalidade legal. Você pode fazer uma pequena função.

cdlast () {
  set ./*/
  shift "$(($#-1))"
  cd "$1"
}

Com um líder opcional - , mas considerando que os nomes de arquivos iniciados por - são problemáticos, esperamos que você não os use.

    
por 27.01.2016 / 00:47
2

Se você só tem diretórios sendo criados, você pode encontrar o último arquivo / dir usando -

ls -tr1 |tail -1
to cd to it --
cd $(ls -tr1 | tail -1)

Se você tiver arquivos e diretórios, mais trabalho será necessário -

cd $(ls -ltr |grep ^d |tail -1 | awk '{print $9}')

outras opções - find with mtime (você precisa saber a janela quando o diretório foi criado para filtrar) Como todos esses comandos podem levar muito tempo para serem executados se o diretório for grande (100k + arquivos), a melhor maneira de fazer isso é criar um arquivo que contenha o último diretório criado e usá-lo para o último diretório.

    
por 26.01.2016 / 06:24
2

Você pode criar um alias ou função no arquivo .bashrc, por exemplo:

alias lcd="cd $( ls -1 | tail -1 )"

OR

lcd() { cd $( ls -1 | tail -1 ) ; }
    
por 26.01.2016 / 04:43
1

Se você tiver controle sobre o processo que cria os diretórios, pode ser possível adaptá-lo para que ele sempre grave um link simbólico chamado, digamos, latest que aponta para o diretório mais recente.

Isso é o que eu faço no script que extrai fotos do meu cartão de câmera digital e funciona muito bem para mim:

$ ls -loghd pictures/[12l]*
dr-xr-xr-x  4 4.0K May 24  2012 pictures/1989
dr-xr-xr-x  6 4.0K May 24  2012 pictures/1990
...
dr-xr-xr-x 38 4.0K Dec 15 19:59 pictures/2015
drwxr-xr-x  3 4.0K Jan 10 23:03 pictures/2016
lrwxrwxrwx  1   34 Jan 10 23:03 pictures/latest -> 2016/2016-01-10
    
por 27.01.2016 / 11:23