Obtenha o diretório mais recente (não o arquivo mais recente)

12

Minha pasta parent tem o seguinte conteúdo:

A.Folder B.Folder C.File

Tem pastas e arquivos dentro. B.Folder é mais recente. Agora eu só quero pegar B.Folder , como eu poderia conseguir isso? Eu tentei isso,

ls -ltr ./parent | grep '^d' | tail -1

mas isso me dá drwxrwxr-x 2 user user 4096 Jun 13 10:53 B.Folder , mas eu só preciso do nome B.Folder .

    
por Daniel 13.06.2014 / 17:24

5 respostas

22

Tente isto:

$ ls -td -- */ | head -n 1

-t opções tornam ls sort por hora de modificação, a mais nova primeiro.

Se você quiser remover / :

$ ls -td -- */ | head -n 1 | cut -d'/' -f1
    
por 13.06.2014 / 17:36
5
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

Diferença para A solução de Herson é a barra após * , o que faz com que o shell ignore todos os arquivos não-dir. Diferença para Gnouc , funcionará se você estiver em outra pasta.

Cut precisa saber o número de diretórios pai (2) para excluir '/'. Se você não tem isso, use

VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"
    
por 14.06.2014 / 03:55
3

Resposta zig obrigatória:

latest_directory=(parent/*(/om[1]))

Os caracteres entre parênteses são qualificadores de glob : / para corresponder apenas aos diretórios , om para ordenar correspondências aumentando a idade e [1] para manter apenas a primeira correspondência (ou seja, a mais recente). Adicione N se você deseja obter uma matriz vazia (normalmente você obtém uma matriz de um elemento) se não houver um subdiretório de parent .

Como alternativa, supondo que parent não contenha nenhum caractere de globalização:

latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory

Se você não tem zsh, mas tem ferramentas GNU recentes (por exemplo, Linux ou Cygwin não integrado), é possível usar find , mas é complicado. Aqui está uma maneira:

latest_directory_inode=$(find parent -mindepth 1 -maxdepth 1 -type d -printf '%Ts %i\n' | sort -n | sed -n '1 s/.* //p')
latest_directory=$(find parent -maxdepth 1 -inum "$latest_directory_inode")

Há uma solução simples com ls , que funciona desde que nenhum nome de diretório contenha novas linhas ou (em alguns sistemas) caracteres não imprimíveis:

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}
    
por 16.06.2014 / 03:33
1

Você pode fazer:

ls -td -- ../parent/* | head -n 1
    
por 13.06.2014 / 18:41
0

O comando a seguir fará o trabalho mesmo no caso de um nome de diretório contendo espaço:

cp 'find . -mindepth 1 -maxdepth 1 -type d  -exec stat --printf="%Y\t%n\n" {} \;  |sort -n -r |head -1 |cut -f2''/* /target-directory/.

A explicação atualizada das coisas nos backticks é:

  • . - o diretório atual (você pode querer especificar um caminho absoluto aqui)
  • -mindepth/-maxdepth - restringe o comando find somente aos filhos imediatos do diretório atual
  • -type d - apenas diretórios
  • -exec stat .. - gera o horário modificado e o nome do diretório de find separado por uma tabulação (e não um espaço)
  • sort -n -r |head -1 | cut -f2 - date ordena o diretório e gera o nome completo da guia modificada mais recentemente (mesmo que contenha algum espaço como separador de corte padrão)
por 10.02.2018 / 16:28