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

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

Minha pasta parenttem o seguinte conteúdo:

A.Folder B.Folder C.File

Ele contém pastas e arquivos. B.Folderé mais recente. Agora eu só quero chegar B.Folder, como posso 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.

Responder1

Experimente isto:

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

-tas opções lsclassificam por horário de modificação, o mais novo primeiro.

Se você quiser remover /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1

Responder2

ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

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

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

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

Responder3

Resposta zsh obrigatória:

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

Os caracteres entre parênteses sãoeliminatórias globais: /para corresponder apenas aos diretórios, ompara classificar as correspondências aumentando a idade e [1]para reter apenas a primeira correspondência (ou seja, a mais recente). Adicione Nse desejar obter um array vazio (normalmente você obtém um array de 1 elemento) se não houver subdiretório de parent.

Como alternativa, supondo que parentnão contenha nenhum caractere global de shell:

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

Se você não possui zsh, mas possui ferramentas GNU recentes (ou seja, Linux não embarcado ou Cygwin), você pode 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")

Existe 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%/}

Responder4

O comando a seguir fará o trabalho mesmo no caso do nome do diretório conter 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 crases é:

  • .- o diretório atual (você pode especificar um caminho absoluto aqui)
  • -mindepth/-maxdepth- restringir o comando find apenas aos filhos imediatos do diretório atual
  • -type d- apenas diretórios
  • -exec stat ..- exibe a hora modificada e o nome do diretório de find separados por uma tabulação (e não por um espaço)
  • sort -n -r |head -1 | cut -f2- date ordena o diretório e exibe o nome completo do modificado mais recentemente (mesmo que contenha algum espaço como corte da guia delimitadora padrão)

informação relacionada