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

15

Minha pasta parenttem o seguinte conteúdo:

A.Folder B.Folder C.File

Possui pastas e arquivos dentro. B.Folderé mais novo. Agora eu só quero entender 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.

Daniel
fonte
1
usar estels -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا
Usar o awk funciona, mas quero ver se há uma solução mais limpa. :)
Daniel
encontrar . -maxdepth 1 -type d | TZ = utc xargs ls -ld - tempo integral |
class

Respostas:

24

Tente o seguinte:

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

-tAs opções são lsclassificadas por hora da modificação, as mais novas primeiro.

Se você deseja remover /:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1
cuonglm
fonte
1
Como se livrar da barra /?
Daniel
Isso não funciona se você estiver em outra pasta. Quero dizer ls -td -- ./parent | head -n 1, não me fornece os resultados corretos, PRECISO usar subshell, como cd ./parentsempre, e executar este comando? Qualquer solução?
21714 Daniel
@ Daniel: Você deve executar minha resposta no diretório de trabalho atual para fazê-lo funcionar. Caso contrário, você deve usar um caminho relativo, como a resposta de Herson.
cuonglm
Remover por último / não funciona. Exemplo: / home / cuo / bin / Esperado: / home / cuo / bin
Marius
5
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

A diferença da solução de Herson é a barra seguinte *, que faz com que o shell ignore todos os arquivos não-dir. Diferença do Gnouc , ele funcionará se você estiver em outra pasta.

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

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

Resposta obrigatória do zsh:

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

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

Como alternativa, supondo que parentnão contenha nenhum caractere globbing do shell:

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

Se você não possui o zsh, mas possui ferramentas GNU recentes (por exemplo, Linux ou Cygwin não incorporado), pode usá- findlo, 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 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%/}
Gilles 'SO- parar de ser mau'
fonte
2

Você pode fazer:

ls -td -- ../parent/* | head -n 1
O filho dela
fonte
Isso fornece o arquivo mais recente. Daniel só quer diretórios.
Gilles 'SO- stop be evil'
2

O comando a seguir fará o trabalho mesmo no caso de o 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 backticks é:

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