Obtém o arquivo mais recente do diretório não atual

3

Estou com problemas para executar um comando que me fornecerá o arquivo mais recente de outro diretório.

Exemplo:

ls -tr | tail -n 1  /prj/somedir/anotherdir/closerdir/targetdir

há uma lista de arquivos no targetdir e eu preciso isolar o arquivo mais recente da lista.

Quando eu digito o comando, o problema é que estou usando o comando tail para um diretório.

Exemplo 2:

ls -tr | tail -n 1 

Usar o comando tail funciona se eu estou tentando obter o arquivo mais novo do diretório em que estou trabalhando, mas não se estou tentando consumir de outro diretório usando o caminho absoluto.

Alguma sugestão sobre como posso realizar essa tarefa?

    
por Brandi 13.01.2012 / 21:27

4 respostas

2

Você não especifica um shell, então eu aconselho você a usar o Zsh :

ls /path/to/*(.om[1]) 

Veja um exemplo com cinco arquivos que foram criados no mesmo minuto (nomes de arquivos no formulário HHMMSS.txt ):

> ls tmp/378142 
total 0
drwxr-xr-x   7 johnsyweb  staff  238 14 Jan 08:23 ./
drwx------  24 johnsyweb  staff  816 14 Jan 08:20 ../
-rw-r--r--   1 johnsyweb  staff    0 14 Jan 08:22 082237.txt
-rw-r--r--   1 johnsyweb  staff    0 14 Jan 08:22 082238.txt
-rw-r--r--   1 johnsyweb  staff    0 14 Jan 08:22 082239.txt
-rw-r--r--   1 johnsyweb  staff    0 14 Jan 08:22 082240.txt
-rw-r--r--   1 johnsyweb  staff    0 14 Jan 08:22 082241.txt

Usando echo :

> echo tmp/378142/*(.om[1])
tmp/378142/082241.txt

Usando ls :

> ls -laF tmp/378142/*(.om[1]) 
-rw-r--r--  1 johnsyweb  staff  0 14 Jan 08:22 tmp/378142/082241.txt

Explicação:

Isso usa a expansão de nome de arquivo do Zsh.

Um asterisco é expandido para todos os itens em um diretório:

> echo tmp/378142/*        
tmp/378142/082237.txt tmp/378142/082238.txt tmp/378142/082239.txt tmp/378142/082240.txt tmp/378142/082241.txt

Modificando isso com um . , significa todos os arquivos regulares (sem diretórios ou links simbólicos). Isso é conhecido como um sinalizador globbing :

> echo tmp/378142/*(.)  
tmp/378142/082237.txt tmp/378142/082238.txt tmp/378142/082239.txt tmp/378142/082240.txt tmp/378142/082241.txt

o especifica a ordem de classificação, on , por nome:

> echo tmp/378142/*(.on)
tmp/378142/082237.txt tmp/378142/082238.txt tmp/378142/082239.txt tmp/378142/082240.txt tmp/378142/082241.txt

om é ordenado por tempo modificado ( Om ) inverteria a ordem:

> echo tmp/378142/*(.om)
tmp/378142/082241.txt tmp/378142/082240.txt tmp/378142/082239.txt tmp/378142/082238.txt tmp/378142/082237.txt

[1] seleciona o primeiro item da lista:

> echo tmp/378142/*(.om[1])
tmp/378142/082241.txt
    
por 13.01.2012 / 21:50
1

Não estou claro sobre o que você quer. Se você quiser o nome do arquivo mais recente em um diretório

  ls -t /prj/somedir/anotherdir/closerdir/targetdir | head -n 1
    
por 13.01.2012 / 22:22
0
find /your/path -type f -exec ls -l \{\} \;

Deve dar-lhe um bom começo (apenas os arquivos são listados com verbose ls output. Não apenas classifique a saída e imprima a linha necessária.

    
por 13.01.2012 / 21:38
0

A resposta é muito simples - você precisa colocar o caminho para o diretório em questão logo após o comando ls -t ou senão ls achará que você está falando do diretório atual. Então head lerá a saída canalizada de ls e ecoará a linha superior. Daí a confusão. Então é só uma questão de fazer certo:

$ ls -t /prj/somedir/anotherdir/closerdir/targetdir | head -n 1
    
por 13.01.2012 / 22:48