Isso tem me deixado louco...
Quero listar os arquivos em um diretório e, com base no número de interação em todos os arquivos, exceto o mais recente, aqui está o trecho de código
FILECOUNT=$(ls -lt [dir]*.log | grep -c .log )
for (( c=2; c<=$FILECOUNT; c++ ))
do
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")
Tenho tido problemas de $c
interpretação, o formato acima funciona, mas o comando sed falha... embora inserir a última linha do log no cli funcione perfeitamente
FILECOUNT=24
(( c=2 ))
(( c<=24 ))
C is : 2
'ls -1t [dir]*.log | sed -n '\''2 p'\'''
line 41: ls -1t [dir]*.log | sed -n '2 p': No such file or directory
Qualquer ajuda seria muito apreciada!
o [dir]
é obviamente um diretório válido
Responder1
O principal problema que você tem é colocar tudo na substituição do comando entre aspas duplas:
FILEDIR=$("ls -1t [dir]*.log | sed -n '$c p'")
Isso instruiria o shell a localizar um arquivo executável comnome literal ls -1t [dir]*.log | sed -n '$c p'"
e sem argumentos, em vez de executar o comando ls
com opções -1t
e operando [dir]*.log
cuja saída deve ser canalizada para o executável sed
com opção -n
e argumento '$c p'
. Tente remover as aspas duplas, como em
FILEDIR=$(ls -1t [dir]*.log | sed -n '$c p')
No entantoentão você enfrentará o problema de que a expansão da variável está desabilitada em seu sed
comando entre aspas simples. Ummaneira recomendadaé quebrar o argumento entre aspas simples e colocar a variável entre aspas duplas, como em
FILEDIR=$(ls -1t [dir]*.log | sed -n "$c"' p')
Além disso, devo emitir o aviso obrigatórionão analisar a saída dels
. ;)