Eu preciso executar uma operação de substituição global (repetida) no texto de arquivos recursivamente em um diretório, mas há algumas restrições que me deram problemas:
- Eu preciso substituir de uma forma que inclua um caractere de nova linha, que interrompe o sed, como mencionado aqui: Por que o sed está me dando um erro sobre um 'não-terminado'?
- Eu preciso produzir os arquivos em um diretório diferente porque estou usando o AWS DataPipeline e preciso solucionar um problema que estava ocorrendo devido a alterações nos arquivos do InputDirectory durante a execução do comando.
(Portanto, preciso gravar cada arquivo modificado em um arquivo com o mesmo nome de arquivo, mas localizado no OutputDirectory.)
- Também tive problemas ao tentar reduzir o nome do arquivo de saída
Então, fico com algo que talvez fosse:
- use
find
para enumerar os arquivos
- percorra os arquivos e, para cada arquivo, substitua o caminho de entrada pelo caminho de saída (talvez até com
sed
)
-
cat
o arquivo e canaliza o conteúdo para awk
e grava o conteúdo no caminho atualizado.
- constrói os diretórios necessários no processo (que, acredito, devem acontecer automaticamente a partir do redirecionamento de saída, mas quero explicá-lo apenas no caso)
Existe uma maneira simples de fazer isso?
-
Se você usar o GNU sed
, poderá usar \n
para nova linha na string de substituição. Com outro sed
, use uma nova linha literal, mas escape com uma barra invertida.
-
use find ... -print | sed -e 's:oldpath:newpath:'
em vez de um loop de shell para alterar os caminhos.
Se oldpath ou newpath contiver :
caracteres, use um delimitador diferente.
E se algum dos nomes de arquivo puder conter um caractere de nova linha (que é IS um caractere de nome de arquivo válido) e o GNU sed estiver disponível (padrão / padrão no linux), use a opção -print0
do find em vez de -print
e -z
da opção do GNU sed: sed -z -e 's:oldpath:newpath:'
-
você pode criar o caminho do diretório com algo como mkdir -p "$(dirname "$filename")"
para cada nome de arquivo de entrada.
-
por que não usar apenas rsync -a sourcedir destdir
, opcionalmente com algumas opções relevantes --exclude
e / ou --include
?
por
17.01.2018 / 05:33