Eu tenho um script bash que enumera todos os arquivos * .php em um diretório e se aplica iconv
a ele. Isso obtém saída em STDOUT.
Como adicionar o -o
parâmetro (na minha experiência) realmente grava um arquivo em branco provavelmente antes da conversão, como posso ajustar meu script para que ele faça a conversão e substitui o arquivo de entrada?
for file in *.php
do
iconv -f cp1251 -t utf8 "$file"
done
shell
text-processing
io-redirection
meder omuraliev
fonte
fonte
Respostas:
Isso não está funcionando porque
iconv
primeiro cria o arquivo de saída (já que o arquivo já existe, ele o trunca) e depois começa a ler o arquivo de entrada (que agora está vazio). A maioria dos programas se comporta dessa maneira.Crie um novo arquivo temporário para a saída e mova-o para o lugar.
Se a sua plataforma
iconv
não tiver-o
, você poderá usar um redirecionamento de shell para o mesmo efeito.O
sponge
utilitário de Colin Watson (incluído no moreutils de Joey Hess ) automatiza isso:Esta resposta se aplica não apenas a,
iconv
mas a qualquer programa de filtro. Vale a pena mencionar alguns casos especiais:-p
têm uma-i
opção para substituir os arquivos no local.grep
,tr
,sed 's/long input text/shorter text/'
), e você gosta de viver perigosamente, você pode querer realmente modificar o arquivo no local (as outras soluções mencionadas aqui criar uma novo arquivo de saída e mova-o para o lugar no final, para que os dados originais permaneçam inalterados se o comando for interrompido por qualquer motivo).fonte
sponge
deve ser atribuída exclusivamente a Joey Hess; é o pacotemoreutils
quesponge
ele mantém, mas no que diz respeito à origemsponge
, seguindo os links da página inicial demoreutils
, eu o achei originalmente publicado e sugerido para inclusão por Colin Watson: "Joey escreve sobre a falta de novas ferramentas que se encaixam na filosofia do Unix. Meu favorito de tais coisas que escrevi ésponge
"(Seg, 06 de fevereiro de 2006).iconv -f cp1251 -t utf8 "$file" > "$file.new"
sort
, são bastante inteligentes em relação aos-o
parâmetros, e se eles detectam o arquivo de saída é o mesmo que a entrada, eles gerenciam internamente um arquivo temporário, para que funcione.Uma alternativa é
recode
, que usa a biblioteca libiconv para algumas conversões. Seu comportamento é substituir o arquivo de entrada pela saída, portanto, isso funcionará:Como
recode
aceita vários arquivos de entrada como parâmetro, você pode poupar ofor
loop:fonte
info recode
. É mais detalhado.Para agora
Funciona como um encanto
fonte
Você pode usar o Vim no modo Ex:
%
selecione todas as linhas!
comando de execuçãox
salvar e fecharfonte
Aqui está um exemplo simples . Deve fornecer informações suficientes para começar.
fonte
funciona para mim
fonte
Você pode usar find, pelo menos isso funcionou para mim no Raspbian Stretch:
fonte
Uma opção é usar
perl
a interfaceiconv
e o-i
modo para edição no local:Com o GNU
awk
, você também pode fazer algo como:O
ksh93
shell também possui um>;
operador para o que armazena a saída em um arquivo temporário que é renomeado para o arquivo redirecionado se o comando for bem-sucedido:fonte