Convertendo guias em espaços em muitos arquivos

10

Eu tenho muitos arquivos com guias espalhadas por toda parte e gostaria de convertê-los em espaços. Eu sei sobre o comando expand , mas infelizmente eu teria que digitar todos os arquivos usando-o. Existe alguma maneira mais fácil de fazer isso no Linux?

    
por person 02.07.2010 / 06:51

6 respostas

12

Tente o seguinte:

find ./ -type f -exec sed -i 's/\t/ /g' {} \;

Se você quiser quatro espaços, tente:

find ./ -type f -exec sed -i 's/\t/    /g' {} \;
    
por 02.07.2010 / 07:21
6

Existem muitas maneiras de fazer isso. Há também muitas maneiras de se fotografar no próprio pé ao fazer isso, se você não for cuidadoso ou se for novo no Linux como você parece ser. Supondo que você possa criar uma lista de arquivos que você deseja converter, seja usando algo como find ou manualmente com um editor, apenas envie essa lista para o seguinte.

while read file
do
   expand "$file" > /tmp/expandtmp
   mv /tmp/expandtmp "$file"
done

Uma maneira de você se atirar no pé com isso é fazer um erro de digitação, de modo que você acabe com um arquivo vazio em todos os nomes de arquivo que você especificar, desse modo, excluindo o conteúdo de todos os seus arquivos. Portanto, tenha cuidado e teste o que você fizer primeiro em um pequeno conjunto de arquivos do qual fez backup.

    
por 02.07.2010 / 07:24
3
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo

-I foo cria uma variável de template foo para cada linha de entrada, então você pode se referir à entrada mais de uma vez.

-print0 e -0 informam ambos os comandos para usar \ 0 como um separador de linha em vez de SPACE, portanto, esse comando funciona para caminhos com espaços.

    
por 10.06.2013 / 01:59
1
find -name \*.js -exec bash -c 'expand -t 4 "$0" | tee "$0"' {} \;

Contras:
arquivos maiores que o tamanho do buffer de canal ( 64KB ) são truncados

Prós:
sem arquivos temporários
arquivos maiores que o tamanho do buffer do pipe são truncados

    
por 01.05.2015 / 02:03
0

Isso é melhor:

find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
    
por 08.03.2014 / 17:52
0

Eu dei a este problema uma chance com os seguintes requisitos em mente:

  • Filtre os arquivos com base em seus nomes, para processar, por exemplo, apenas arquivos .cpp ou .json
  • Suporta processamento paralelo. Caso haja muitos arquivos, isso pode fornecer uma grande aceleração
  • A solução deve caber em uma linha para facilitar o uso

O último requisito foi o mais difícil de ser cumprido porque "expandir" não permite modificar os arquivos no lugar.

Eu criei a seguinte solução:

find . -type f -regextype egrep -regex '.*\.(c|cpp|h|hpp)'  -print0 | xargs -0 -n 1 -P 10 -IFILE bash -c ' ( echo "Processing FILE..." && expand -t 4 "FILE" > /tmp/expand.$$ && mv /tmp/expand.$$ "FILE" ) || exit 255'

Aqui está uma explicação:

  • "find" encontra os arquivos a serem processados. "-regextype egrep" permite filtrá-los com base em seu nome e uma expressão regular no formato "egrep"
  • o parâmetro "-type f" certifica-se de que corresponderemos apenas a arquivos regulares, não por exemplo diretórios ou qualquer outra coisa especial
  • o parâmetro "-regexp" é a própria expressão regular, que corresponde neste caso a qualquer arquivo que termine com .c, .cpp, .h ou .hpp (o nome inteiro deve corresponder, então "file.c2" não, que é o que queremos)
  • "- print0" instrui "localizar" para imprimir os caminhos de arquivo em sua saída padrão com o caractere 0 no final de cada caminho. Juntamente com a opção "-0" para "xargs", permite passar nomes contendo carrinhos de retorno de uma ferramenta para outra (mesmo que seja uma situação bastante rara ...)
  • xargs inicia um novo processo para cada caminho ("-n 1"), mas pode executar até 10 processos em paralelo ("-P 10")
  • xargs usa o alias "FILE" para passar cada caminho de arquivo para o comando, que é um script bash
  • o script bash chama "expandir" e salva o resultado em um arquivo temporário cujos nomes contêm o ID do processo atual ($$), para que todos os processos executados em paralelo em um determinado arquivo usem arquivos temporários diferentes
  • o comando inteiro usa o padrão (comando1 & comando2 & &; comando3) para que o processo seja interrompido se algum subcomando retornar um erro
  • se houver algum erro do "& &" anterior chain, o script bash retornará um código de saída 255 que fará com que os xargs parem imediatamente
por 13.07.2017 / 18:17