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?
Seu comando não faz muito sentido:
ls -t grep -v /
significa "executarls
com as opções-t
e-v
nos arquivos ou diretórios chamadosgrep
e/
". Executá-lo resulta em uma mensagem de errols: cannot access 'grep': No such file or directory
e, em seguida, na saída dels /
. Também não entendi o que otr
deveria 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:
A
-t
ordenação é feita por data de modificação, o-d
comando informals
para 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 explicitamentels
para exibi-los com-a
ou-A
, portanto, nada mais é necessário. Ao contrário de tentar analisar a saídals
usandogrep
ou ferramentas semelhantes, essa abordagem pode funcionar com nomes de arquivo arbitrários. Por exemplo, eu tenho um subdiretório chamadoa bad'$'\n''name
, onde$'\n'
é um caractere de nova linha real, uma quebra de linha:se eu tentar usar
grep
para analisar não diretórios, obtenho a saída errada:No entanto, funciona como esperado com
*/
: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:
Agora, se eu
ls -d */
: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):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:
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:Por fim, você pode evitar
ls
completamente e fazer: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:
para pegar os resultados e imprimi-los em um arquivo
midLS
em uma única linha unida pela string,
(vírgula+espaço):Se você quiser ordenar os resultados mais antigos primeiro, mude
om
paraOm
.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
^@
: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:Editar: pensei
ls -td */
que não incluísse a/
saída, mas inclui.Se entendi seu caso corretamente, isso deve resolver:
-t
classifica por hora de modificação,-d
exibe apenas diretórios. Conforme indicado nos comentários, isso também funcionará para nomes de diretórios ímpares .