Como percorrer um diretório ou lista de arquivos com um caractere curinga em um script Bash?

0

Estou tentando anonimizar meus logs do Apache depois de 7 dias e, na verdade, já tenho alguns problemas para escrever o arquivo para anonimizar.

Meu script substitui o primeiro dígito 3 por X e funciona corretamente ao executar um arquivo de log no mesmo diretório do script bash.

Mas eu gostaria de usar o caractere curinga para anonimizar todos os registros dos meus subdomínios, assim:

./anonym /basedir/*/logs/access.log

Mas isso não funciona corretamente.

Aqui está o meu script:

#!/bin/bash

while IFS='' read -r line || [[ -n "$line" ]]; do
        echo "$line"  | sed s/./X/1 | sed s/./X/2 |sed s/./X/3
done < "$1">"/tmp/$1"

mv "/tmp/$1" "$1"

Obrigado por qualquer ajuda.

    
por Yann 27.05.2018 / 16:46

2 respostas

1

Para realizar as mesmas ações para vários arquivos, você precisa envolver seu código em um loop, por exemplo:

#!/bin/bash

tmpfile=/tmp/anon.$$

for path; do
    while IFS='' read -r line || [[ -n "$line" ]]; do
        echo "$line" | sed -e s/./X/1 -e s/./X/2 -e s/./X/3
    done < "$path" > "$tmpfile"

    mv "$tmpfile" "$path"
done
    
por 28.05.2018 / 18:49
0

Como você grava no mesmo arquivo, use apenas sed -i (não é POSIX). De man 1 sed :

-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied). The default operation mode is to break symbolic and hard links. This can be changed with --follow-symlinks and --copy.

Além disso, a seguinte expressão sed pode substituir as três separadas: s/.../XXX/ . Não é totalmente equivalente em geral, talvez você gostaria de melhorá-lo. De qualquer forma, usando -i , tudo o que você precisa fazer é:

sed -i 's/.../XXX/' /basedir/*/logs/access.log
    
por 29.05.2018 / 09:49

Tags