o que estou perdendo?
Eu quero descobrir quantos arquivos correspondem a um determinado padrão em um diretório e atribuí-lo a uma variável.
Se eu digitar tudo direto na linha de comando, funciona bem
ls /backups/system\ db\ files/temp/daily/backup_filename_202203*.tar.gz | wc -l
(nb *
é a data em que o backup foi criado, por exemplo 01
, 02
, 03
etc.)
Mas assim que eu o adiciono ao meu script bash, ele falha.
Até agora tenho:
base_dir="/backups/system\ db\ files/temp"
sub_dir="${base_dir}/daily"
filename_base="backup_filename_"
e então eu tento e executo:
counter=$(ls ${sub_dir}/${filename_base_}202203*.tar.gz | wc -l)
ou com citações:
counter=$(ls "${sub_dir}/${filename_base_}202203*.tar.gz" | wc -l)
O primeiro falha ao tentar dividi-lo com base nos espaços em branco. O segundo não expande o *
para procurar os curingas.
Eu tentei apenas citar alguns deles, por exemplo
counter=$(ls "${sub_dir}/${filename_base_}"202203*.tar.gz | wc -l)
Mas, novamente, ele ignora o curinga.
Estive procurando, mas não consigo encontrar uma maneira de obter o número total de arquivos correspondentes.
Seu problema é que seu diretório não é chamado
/backups/system\ db\ files/temp
, é chamadobackups/system db files/temp
. Ao citar a string, você torna as barras invertidas parte da string. Como você cita a string, não há necessidade de escapar dos espaços. Você também tem a grafia errada da variávelfilename_base
em alguns lugares (com um sublinhado à direita).Você também não precisa usar
ls
ewc
contar o número de nomes que correspondem a um padrão de shell. Lembre-se de que nomes de arquivos podem ter novas linhas em seus nomes e issowc -l
conta novas linhas, não nomes de arquivos.Tudo o que você precisa fazer para ver quantas correspondências existem para um padrão de shell é expandir o padrão em uma matriz ou na lista de parâmetros posicionais e, em seguida, ver quanto tempo essa matriz ou lista se tornou.
Usando um array com um padrão de exemplo:
Usando a lista de parâmetros posicionais:
No
bash
shell, você terá que definir anullglob
opção shell usingshopt -s nullglob
para manipular corretamente os diretórios vazios (o padrão geralmente não é expandido se não corresponder a nada).Sem definir
nullglob
, você pode testar se não houve correspondências usandoou, se você usou os parâmetros posicionais,
Se os testes negados
-e
e forem verdadeiros para o primeiro elemento na lista resultante, o primeiro elemento não será um arquivo existente e não será um link simbólico quebrado. Isso significa que não houve correspondências para o padrão.-h
Você não escapa dos espaços quando já os citou, caso contrário as barras invertidas serão interpretadas literalmente:
deveria estar
Também por que você tem
_
em${filename_base_}
?Seu último comando provavelmente deveria ter funcionado se todo o resto estivesse correto:
De qualquer forma, você não deve analisar
ls
.Em vez disso, use
find
:ou uma matriz:
Você precisa da
nullglob
opção, caso contrário, o resultado será1
se nenhum arquivo corresponder ao seu padrão, pois a string é interpretada literalmente.