'Find' saída como o intervalo de 'for' no Bash está fazendo no modo batch

0

Eu fiz um processo de loop usando o comando Bash for , no Linux mint, com o intervalo de entrada do processo anterior vindo de find , mas aparentemente e claramente em processo de lote relativo à saída do terminal, em vez do imediato se find range for explícito e executado para fornecer uma saída de terminal. o meu é;

IFS=$'\n'
for s in $(find ~+ -type f -regextype posix-extended -iregex ".*/data\.(tmp|bak)" -printf '%p\n')
    {
    echo $s
    }

ainda ficará sem saída por 100 s. ou mais, em vez de mostrar diretamente alguns no terminal. Como fazê-lo funcionar tão rápido quanto find instruído sozinho e diretamente? obrigado antecipadamente, eu agradeço.

    
por abdan 22.09.2018 / 06:49

1 resposta

0

Um loop for faz a iteração em uma lista estática , sempre. Portanto, o corpo do loop em sua pergunta não começará a ser executado até que os itens sobre os quais ele será iterado sejam completamente especificados. Estes não serão completamente especificados até que o comando find tenha terminado a execução.

Existem vários problemas com o seu comando, e a maioria é abordada pela pergunta " Por que o loop é sobre a má prática de saída do find? ".

Em geral, é melhor ter find agindo como um gerador de nome de caminho para um script interno:

find ~+ -type f \( -iname data.tmp -o -iname data.bak \) -exec sh -c '
    for pathname do
        # process "$pathname" here
    done' sh {} +

Desta forma, você não precisa se preocupar sobre como os nomes de caminho que find dá ao loop são delimitados (isso manipulará facilmente nomes de caminho contendo espaços e novas linhas, etc.)

Relacionados:

por 22.09.2018 / 09:39

Tags