Pergunta

Eu estou tentando formatar a saída de ls -la a apenas contêm arquivos modificados em dezembro e saída-los muito bem, é isso que eles atualmente parecido:

ls -la | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5
Dec 4 20:15 folder/
Dec 4 19:51 ./
Dec 4 17:42 Folder\ John/
Dec 4 16:19 Homework\ MAT\ 08/
Dec 4 16:05 Folder\ Smith/

etc ..

Como posso criar algo como uma expressão regular para não incluir coisas como "./" e "../",

Além disso, como posso omitir a barra "\" para pastas que têm espaços entre eles. Eu gostaria de deixar cair a barra no final. Isso é possível através de um comando shell? Ou eu teria de usar Perl para fazer modificações para o teste? Eu quero a data e hora para permanecer como está. Qualquer ajuda seria muito apreciada!

A caixa tem linux e isto está sendo feito via SSH.

Editar:

Aqui está o que eu tenho até agora (graças a Mark e gbacon para isso)

ls -laF | grep -vE ' ..?/?$' | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } ' | grep "Dec" | sort -r | head -5

Im apenas tendo problemas com a substituição de "\" com apenas um espaço "". Outras que Obrigado por toda a ajuda até este ponto!

Foi útil?

Solução

Você pode usar find para fazer a maioria do trabalho para você:

find -mindepth 1 -maxdepth 1 -printf "%Tb %Td %TH:%TM %f\n" | grep "^Dec" | sort -r

O diretório pai (..) não está incluído por padrão. O -mindepth 1 se livrar do diretório atual (.). Você pode remover o -maxdepth 1 para torná-lo recursivo, mas você deve mudar o %f para %p para incluir o caminho com o nome do arquivo.

Estes são os campos no -printf:

  • % Tb - nome do mês curto
  • % Td - dia do mês
  • % TM:% TM - horas e minutos
  • % f - filename

No grep Eu adicionei uma correspondência para o início da linha de modo que não irá corresponder a um arquivo chamado "Decimal" que foi modificado em novembro, por exemplo.

Outras dicas

Verifique e verifique se o comando 'ls' não é alias para outra coisa. Normalmente, ls "crus" não lhe dá o / para diretórios, nem deve ser escapar os espaços.

É evidente que algo está escapando os espaços para você para o seu awk estar imprimindo esses arquivos, desde awk tende a quebrar campo por espaços em branco, que é o que os \ personagens são para.

Spaces é nomes de arquivos são projetados especificamente para frustrar escrita fácil de script e tubos mashups como você está se tentando fazer aqui.

Você pode filtrar a saída de ls:

ls -la | grep -vE ' ..?/?$' | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5

Se você é conteúdo para usar Perl:

ls -la | perl -lane 's/\\ / /g;
                     print "@F[5..9]"
                       if $F[8] !~ m!^..?/?$! &&
                          $F[5] eq "Dec"'

Aqui está uma das suas respostas:

Como posso criar algo como uma expressão regular para não incluir coisas como "./" e "../",

Use ls -lA vez de ls -la.

Em vez de imprimir um número fixo de colunas, você pode imprimir tudo, desde a coluna 6 t o fim da linha:

ls -lA | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } '

Eu não obter os espaços com barra invertida, então eu não sei por que você está recebendo isso. Para corrigi-lo, você pode adicionar o seguinte:

| sed 's/\\//g'

o que é com todos os greps e SEDS ???

ls -laF | awk '!/\.\.\/$/ && !/\.\/$/ &&/Dec/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); }'

bem você pode soltar . e .. adicionando grep -v "\." | grep -v "\.\."

não tem certeza sobre o resto

Isso realmente me irrita ver pipelines com awk e grep / sed. Awk é uma ferramenta muito poderosa de processamento de linha.

ls -laF | awk '
    / \.\.?\/$/ {next}
    / Dec / {for (i=1; i<=5; i++) $i = ""; print} 
' | sort -r | head -5
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top