AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1545419
Accepted
Can Cetin
Can Cetin
Asked: 2025-04-09 22:05:01 +0800 CST2025-04-09 22:05:01 +0800 CST 2025-04-09 22:05:01 +0800 CST

Como listar diretórios classificados por data de modificação?

  • 772

Tentei executar ls -t grep -v / | tr ',' ' '. Esse comando tem como objetivo listar todos os diretórios nesse diretório que não sejam diretórios ocultos, com ponto ou ponto duplo. A questão é que, em um arquivo chamado midLS, escreva o comando que lista todos os arquivos e diretórios no seu diretório atual (excluindo arquivos ocultos ou qualquer arquivo que comece com um ponto, incluindo pontos duplos).

  • A saída deve ser classificada por data de modificação, com entradas separadas por uma vírgula e um espaço.
  • Os nomes de diretórios devem terminar com uma barra (/).

Como listar diretórios em uma única linha? Como resolver isso?

command-line
  • 3 3 respostas
  • 355 Views

3 respostas

  • Voted
  1. terdon
    2025-04-10T02:02:34+08:002025-04-10T02:02:34+08:00

    Seu comando não faz muito sentido: ls -t grep -v /significa "executar lscom as opções -te -vnos arquivos ou diretórios chamados grepe /". Executá-lo resulta em uma mensagem de erro ls: cannot access 'grep': No such file or directorye, em seguida, na saída de ls /. Também não entendi o que o trdeveria fazer ali.

    Em qualquer caso, se tudo o que você quer é listar diretórios e não listar nenhum arquivo ou diretório oculto, você pode simplesmente fazer:

    ls -td */
    

    A -tordenação é feita por data de modificação, o -dcomando informa lspara não retornar ao diretório e o comando glob */corresponde apenas a diretórios. Os diretórios ocultos são ignorados por padrão; você precisa informar explicitamente lspara exibi-los com -aou -A, portanto, nada mais é necessário. Ao contrário de tentar analisar a saída lsusando grepou ferramentas semelhantes, essa abordagem pode funcionar com nomes de arquivo arbitrários. Por exemplo, eu tenho um subdiretório chamado a bad'$'\n''name, onde $'\n'é um caractere de nova linha real, uma quebra de linha:

    $ tree
    .
    ├── a bad\012name
    ├── dir1
    │   └── dir2
    └── rootdir1
        └── rootdir2
    
    6 directories, 0 files
    

    se eu tentar usar greppara analisar não diretórios, obtenho a saída errada:

    $ ls -tF | grep "/$"
    name/
    dir1/
    rootdir1/
    

    No entanto, funciona como esperado com */:

    $ ls -dt */
    'a bad'$'\n''name/'   dir1/   rootdir1/
    

    Observe, no entanto, que no caso de você ter um link simbólico apontando para um diretório, isso também listará esse link simbólico:

    $ ls -lF
    total 4
    drwxr-sr-x 2 terdon terdon 4096 Apr  9 19:34 dir1/
    lrwxrwxrwx 1 terdon terdon    4 Apr  9 19:34 symlink_to_dir -> dir1/
    

    Agora, se eu ls -d */:

    $ ls -d */
    dir1/  symlink_to_dir/
    

    Se isso é desejado ou não dependerá do seu caso de uso, mas não é absurdo dizer que isso é esperado, já que o link simbólico está de fato apontando para um diretório e se comporta como tal em muitos contextos. Ainda assim, ls -tF | grep '/$'o que já havia sido sugerido em outra resposta antes de eu apontar suas limitações, listaria apenas o diretório "real" neste caso (mas falharia em nomes de diretório contendo quebras de linha):

    $ ls -tF | grep '/$'
    dir1/
    

    Por fim, separar a saída por vírgulas é um pouco complicado. Claro, se todos os seus diretórios forem strings simples, sem espaços em branco, você poderia fazer algo como:

    ls -dt */ | tr '\n' ',' | sed 's/,$/\n/'
    

    Mas isso também falhará com nomes de diretório estranhos, aqueles com caracteres de quebra de linha. Se isso for um problema e você tiver uma versão moderna do GNU ls, você pode fazer:

    ls --zero -dt */ | perl -pe 's/\0/, /g; s/, $/\n/'
    

    Por fim, você pode evitar lscompletamente e fazer:

    for dir in */; do printf '%s, ' "$dir"; done | sed 's/, $/\n/'
    
    • 5
  2. steeldriver
    2025-04-10T02:19:01+08:002025-04-10T02:19:01+08:00

    A questão é que em um arquivo chamado midLS, escreva o comando que lista todos os arquivos e diretórios em seu diretório atual (excluindo arquivos ocultos ou qualquer arquivo que comece com um ponto, incluindo pontos duplos).

    A saída deve ser ordenada por data de modificação, com as entradas separadas por vírgula e espaço. Os nomes dos diretórios devem terminar com uma barra (/).

    Eu mudaria para o Z-shell ( zsh) se você ainda não o utiliza. Então:

    • para corresponder a todos os arquivos e diretórios não ocultos, marcando os diretórios com uma barra final e ordenando o resultado pela hora da última modificação , do mais novo primeiro:

      print -r -C1 *(Mom)
      
    • para pegar os resultados e imprimi-los em um arquivo midLSem uma única linha unida pela string , (vírgula+espaço):

       () { print -rl ${(j:, :)@} } *(Mom) > midLS
      

    Se você quiser ordenar os resultados mais antigos primeiro, mude ompara Om.


    Se você considera que links simbólicos não são arquivos nem diretórios, então você pode excluí-los com o qualificador negativo ^@:

    () { print -rl ${(j:, :)@} } *(Mom^@)
    

    Como alternativa, você pode seguir links e classificá-los com base no ponto final (ou seja, indicar links simbólicos para diretórios com uma barra final) usando o -qualificador:

    () { print -rl ${(j:, :)@} } *(-Mom)
    
    • 5
  3. Best Answer
    Artur Meinild
    2025-04-09T22:38:58+08:002025-04-09T22:38:58+08:00

    Editar: pensei ls -td */que não incluísse a /saída, mas inclui.

    Se entendi seu caso corretamente, isso deve resolver:

    ls -td */
    

    -tclassifica por hora de modificação, -dexibe apenas diretórios. Conforme indicado nos comentários, isso também funcionará para nomes de diretórios ímpares .

    • 2

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve