O principal é: os nomes das variáveis não são expandidos entre aspas simples. Esta é uma linha "melhor" (isto é, um pouco menos errada):
ls -al | awk '$6 == "'"$month"'" {print}'
# this is in single quotes ^^^^^^^ ^^^^^^^^^
Mas:
- Ainda assim, isso pode falhar em algumas localidades. Defina
LC_ALL=C
ou talvez por isso. - Com
$month
você pode injetar (quase?) qualquer coisa emawk
. Existem maneiras melhores de usar variáveis emawk
;-v
option deve ser muito mais seguro (obrigado user000001 por apontar isto). -
Você não deve analisar a saída de
ls
em primeiro lugar.
A solução certa pode usar find
e stat
. O código a seguir pode não ser a solução mais rápida, mas é mais robusto devido a:
- descartando valores de
$month
que não correspondem aos valores predefinidos, - usando
find
em vez de analisarls
.
O código:
#!/bin/sh
echo "Enter Month"
read month
case "$month" in
1|01|Jan|jan|January|january) monthN=01;;
2|02|Feb|feb|February|february) monthN=02;;
# ...
10|Oct|oct|October|october) monthN=10;;
# ...
*) echo Error! >&2; exit 1;;
esac
find ./ -maxdepth 1 -exec sh -c '[ 'stat -c %y "$1" | cut -c 6-7' = "$2" ]' sh {} "$monthN" \; -ls
Eu testei isso no Debian; pode não ser super-portátil. Ele mostra a abordagem geral embora.
A última linha invoca um shell separado para cada objeto no diretório atual (incluindo ./
em si). Este shell usa stat
para obter informações mtime e, em seguida, cut
extrai o número de dois dígitos do mês a partir dele. [ ... ]
compara o resultado com o número do mês escolhido. Se esse teste for bem-sucedido, find
executará seu próprio ls
no objeto (você poderá usar -print
ou -print0
).
Observe que isso nunca retorna ../
. Por outro lado, find
permite que você use testes adicionais (como -type f
), portanto, essa abordagem é muito flexível.