Comando de linha única para o último arquivo do cat na saída ls -lrt? [duplicado]

3

Os arquivos de log do sistema são serializados e eu uso ls -lrt para mostrar o arquivo mais recente. Eu então cat desse arquivo. Isso requer a digitação de um número de série longo a cada vez.

Como posso cat o último arquivo aparecer no meu ls -lrt output em um comando?

Estou usando o cygwin e a saída de ls -lrt foobar_job* tem esta aparência:

-

-rw-r--r-- 1 zundarz Domain Users   1133 Jul 31 16:54 foobar_job4855125.log
-rw-r--r-- 1 zundarz Domain Users   1256 Jul 31 17:10 foobar_job4855127.log
-rw-r--r-- 1 zundarz Domain Users   1389 Aug 11 10:20 foobar_job4887829.log
-rw-r--r-- 1 zundarz Domain Users   1228 Aug 11 10:39 foobar_job4887834.log
    
por zundarz 14.08.2015 / 22:16

4 respostas

9

Se você estiver indo para apenas cat um arquivo mais novo em um comando, você realmente não precisa da opção -l . Em Linux e Cygwin você pode usar a opção -1 e tornar a análise muito mais fácil:

$ cat "$(ls -1rt | tail -n1)"

-1 deve ser muito portátil, está especificado em POSIX .

Lembre-se também de que analisar a ls output tem suas desvantagens .

EDITAR:

Como observado corretamente em um comentário por don_crissti você nem precisa -1 :

 $ cat "$(ls -rt | tail -n1)"
    
por 14.08.2015 / 22:27
2

Este método não tem pontuação alta em termos de correção, mas deve funcionar na maioria dos casos: cat "$(ls -1t | head -n1)"

    
por 14.08.2015 / 23:19
1

Tentei no meu sistema e:

~$ cat "$(ls -lrt | tail -n 1 | tr -s ' ' | cut -d ' ' -f9-)"

funcionou.

ls -lrt

Dá os arquivos ordenados pelo tempo de modificação ( -t ) na ordem inversa ( -r ).

tail -n 1

Dá a última linha da saída.

tr -s ''

Remove os espaços de repetição na linha.

cut -d ' ' -f9-

Corta a linha em todos os espaços e fornece o 9º campo, que é o nome do arquivo. Adicionar - ao -f9 também fornece todos os campos a seguir, o que é importante para nomes de arquivos que contêm espaços.

Alias

Se você quiser usar o comando como um alias, terá que escapar dos caracteres " .

Esse " no comando é necessário, porque os arquivos podem ter espaços, que seriam interpretados como mais de um arquivo pelo comando cat , se não estiverem entre " .

Também é necessário escapar do sinal $ . Caso contrário, o comando dentro de $(...) seria executado uma vez, ao definir o alias e não toda vez que o alias for chamado posteriormente.

alias catrec="cat \"\$(ls -lrt | tail -n 1 | tr -s ' ' | cut -d ' ' -f9-)\""
    
por 14.08.2015 / 22:22
-1

Bash one-liner (desde que seus nomes de arquivos não contenham espaços):

cat $(ls -lrt | tail -1 | rev | cut -d" " -f1 | rev)

Explicação:

tail -1        # get last line of your ls
rev            # reverse characters order
cut -d" " -f1  # take first field using space as a separator

Portanto, a coisa rev | cut -d" " -f1 | rev é um truque para ter certeza de obter a última palavra separada por espaço sem ter que fornecer um número de campo de deslocamento dependente de plataforma.

    
por 14.08.2015 / 22:22

Tags