filtra o resultado do comando ls para obter apenas determinados nomes de arquivos com base em um formato

1

Eu tenho um diretório apontado por g_inboundDir que contém os seguintes arquivos: XAI-001-20170709-123456791.pdf YXAI-001-20170709-123456791.pdf 001-20170744-123456791.pdf

Variable g_filPfix="XAI" Variable g_fileExt=".pdf"

Agora eu quero escolher cada arquivo que começa com XAI e processá-lo para isso. Eu escrevi o seguinte comando:

for i in 'ls ${g_inboundDir}/* | grep -E '^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$' 2>/dev/null'

Eu esperava receber apenas o arquivo XAI-001-20170709-123456791.pdf, mas não estou recebendo nenhum arquivo.

    
por AlluSingh 11.07.2017 / 22:34

3 respostas

0
grep -E '^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$'

O problema imediato aqui é que o padrão para grep é agrupado em aspas simples, portanto, o shell não expandirá as variáveis g_filPfix e g_fileExt . Substituir as aspas por aspas duplas resolveria isso. (e você não precisa dos parênteses no padrão).

A análise da saída de ls pode ser problemática com nomes de arquivos com espaços em branco ou alguns caracteres ímpares. Em particular, um nome de arquivo com um espaço no meio seria tomado como dois nomes de arquivo.

Se você não precisa realmente de um padrão tão rígido, você pode simplesmente processar todos os arquivos com o prefixo e o sufixo fornecidos:

for f in "$dir/$prefix"*"$suffix" ; do 
    somecmd "$f"
done

Se você precisar do padrão estrito, alguns shells (como o Bash, que você provavelmente tem no Linux) podem fazer a correspondência de regex sem ferramentas externas. Então, fazer um loop em todos os arquivos no diretório e ignorar os arquivos que não correspondem ao padrão:

for f in "$dir"/* ; do 
    [[ "$f" =~ "/$prefix"-[0-9]{3}-[0-9]{8}-[0-9]{9}"$suffix"$ ]] || continue
    somecmd "$f"
done
    
por 11.07.2017 / 23:12
3

Não analise ls .

for file in "${g_inboundDir}"/XAI*.pdf; do 
    things_to "$file"
done
    
por 11.07.2017 / 22:39
0

Não faça ls. Use find e regexp em vez disso:

find ${g_inboundDir} -regextype sed -regex "^${g_filPfix}-([0-9]{3})-([0-9]{8})-([0-9]{9})${g_fileExt}$"

No final, você pode usar -exec para fazer algo com esses arquivos.
Verifique homem para saber mais sobre o find:)

    
por 11.07.2017 / 22:42