Como prefixar uma linha para todos os arquivos em um diretório?

5

Eu tenho um diretório chamado backup com extensões de arquivo *.sql . O que eu quero fazer é prefixar uma linha em todos os arquivos sql no diretório backup .

Eu fiz echo 'use my_db;' >> backup/*.sql , o que não funcionou.

Eu tentei o item abaixo, mas não sei o que fazer em seguida:

ls backup/*.sql | xargs echo "use my_db;"

Alguma solução para preceder essa linha?

    
por ALH 08.05.2018 / 14:06

3 respostas

12

Usando o GNU sed :

for sql in backup/*.sql; do
    sed -i '1i\use my_db;' "$sql"
done

Com o padrão sed :

for sql in backup/*.sql; do
    sed '1i\
use my_db;
' "$sql" >"$sql.bak" && mv "$sql.bak" "$sql"
done

Isso faria uma edição no local de cada arquivo .sql em backup . O comando de edição insere uma linha antes da primeira linha em cada arquivo.

Isso pressupõe que o padrão backup/*.sql corresponda apenas aos arquivos que você deseja editar.

Usando echo e cat :

for sql in backup/*.sql; do
    { echo 'use my_db;'; cat "$sql"; } >"$sql.tmp" && mv "$sql.tmp" "$sql"
done

Nesse loop, primeiro exibimos a linha que gostaríamos de preceder no arquivo e, em seguida, o conteúdo do arquivo. Isso vai para um arquivo temporário que é renomeado.

O comando

echo 'use my_db;' >> backup/*.sql

se expandiria para algo como

echo 'use my_db;' >> backup/file1.sql backup/file2.sql backup/file3.sql

que é o mesmo que

echo 'use my_db;' backup/file2.sql backup/file3.sql >> backup/file1.sql

que acrescentaria as strings dadas a backup/file1.sql .

Seu segundo comando não modifica nenhum arquivo.

    
por 08.05.2018 / 14:15
4

Solução

sed -i '1 i\use my_db' backup/*.sql

Explicação

sed -i Mantenha as alterações nos arquivos, não as grave em stdout .

1 - Quando sed está posicionado na primeira linha.

i - insira a linha a seguir.

backup/*.sql Arquivos nos quais sed será executado.

    
por 08.05.2018 / 14:20
-3

Você pode iterar todos os arquivos dessa pasta.

for item in $(ls backup/ | grep "*.sql")
do
echo "use my_db;" >> $item
done
    
por 08.05.2018 / 14:45

Tags