A abordagem padrão é usar arquivos temporários, mas você pode alterar os arquivos se você colocar cat
em $()
parênteses:
for file in *.txt; do echo "$file"$'\n'"$(cat -- "$file")" > "$file"; done
Eu tenho um monte de texto (centenas de txt) dentro de um diretório. Cada um deles tem um nome de arquivo exclusivo. Eu quero inserir o nome do arquivo de cada arquivo na primeira linha dos respectivos arquivos. Como posso fazer isso usando o script bash?
Você pode usar o editor de texto padrão:
for f in *; do printf '%s\n' 1i "$f" . w q | ed "$f"; done
for file in *; do
(echo "$file"; cat -- "$file") > "$file.new"
mv -- "$file.new" "$file"
done
Isso faz um loop sobre todos os arquivos
ecoa cada nome de arquivo e
acrescenta o conteúdo do arquivo
então tudo colocando em um novo arquivo
com o sufixo adicional de .new
.
Você cria um novo arquivo para cada existente, então você deve renomear os arquivos depois.
Você pode colocar os resultados em um novo diretório e depois remover o antigo:
mkdir new
for file in *; do
(echo "$file"; cat "$file") > "new/$file"
done
Você também pode usar sed com a opção -i
para fazer a edição no local dos arquivos.
Perl também permite isso. Tudo depende
em quais outras ferramentas você tem disponível. :)