Tentando usar o awk e o comando date ao mesmo tempo

0

Estou tentando usar ls -l e filtrar apenas os arquivos que foram modificados no mês atual. Estou executando: ls -l | awk '{if($6 == date +%b) print$0; e recebo um erro de sintaxe.

Eu tenho procurado em toda parte na internet por regras simples sobre como usar aspas corretamente no awk e no script bashing e eu não consigo entender isso. Estou muito confuso sobre isso, embora eu tenha experiência com programação, portanto, uma resposta geral sobre esses assuntos seria muito mais apreciada do que uma resposta específica que tratará desse caso específico.

    
por PanthersFan92 25.08.2016 / 15:21

2 respostas

4

Você provavelmente não deseja chamar date várias vezes em seu código; é "constante" durante a execução. Então podemos configurá-lo antes e passá-lo como uma variável

por exemplo

ls -l | awk -v month="$(date +%b)" '$6 == month { print }'

Observe que isso falhará se você tiver um arquivo deste mês, mas com um ano de idade (por exemplo, de agosto de 2015) ou em locais onde os nomes de mês contêm espaços ou se houver nomes de arquivo que contenham caracteres de nova linha. Analisando a saída de ls está repleto de perigos

    
por 25.08.2016 / 15:36
1

Tente este loop como variação, então. Ele armazena o mês atual e o ano atual e usa o shell globbing ( * ) para obter a lista de arquivos (como um ls -l usaria, mas não como um ls -al ), então usa o% co_de fornecido pelo GNU % comando para puxar o tempo de modificação de cada arquivo e extrair o mês e ano. Se esse mês e ano forem iguais ao mês e ano atual, execute um stat no arquivo (o ls -ld flag é para evitar listagens não intencionais de subdiretórios quando $ f for um diretório).

thisym=$(date +%Y-%m)
for f in *
do
  ym=$(stat -c %y -- "$f" | cut -d- -f1-2)
  if [ "$ym" = "$thisym" ]
  then
    ls -ld -- "$f"
  fi
done
    
por 25.08.2016 / 15:56