Comando looping tr para remover '\ r' em vários arquivos em um diretório

0

Eu tenho cerca de 260 arquivos em um diretório. Como posso inserir esses arquivos um por um em algo como este? file é um nome de matriz

file=input stream of multiple files 
x=0

LOOP
tr -d '\r'  file2
rm $file
mv file2 $file
x=$x+1
LOOP ends
    
por SamFlynn 23.06.2015 / 06:55

2 respostas

1

Usando um find one-liner:

find . -maxdepth 1 -type f -exec sh -c '< "{}" tr -d "\r" > "{}.processed"' \;

Isso criará uma cópia de cada um dos arquivos no diretório de trabalho atual nomeado como o arquivo original com a extensão .processed .

tr pode ler somente de stdin , por isso não é possível editar arquivos no local de forma nativa, mas um truque é redirecionar o conteúdo de um arquivo para o stdin de um subshell e redirecioná-lo como uma string aqui para tr ' stdin , para que o arquivo seja lido antes que o truncamento necessário para gravar o arquivo ocorra:

find . -maxdepth 1 -type f -exec bash -c '<<< "$(< {})" tr -d "\r" > {}' \;
    
por kos 23.06.2015 / 07:30
1

Usando perl

perl -i -pe 'tr/\r//d' <your_file>

e com find para todos os arquivos da sua pasta:

  • versão longa

    find <your_path> -maxdepth 1 -type f -print0 | xargs -I{} -0 perl -i -pe 'tr/\r//d' {}
    
  • versão curta

    find <your_path> -maxdepth 1 -type f -exec perl -i -pe 'tr/\r//d' {} \;
    

Exemplo

$ printf "%s\n%s\n" "line 1" "line 2" > foo
$ printf "%s\r\n%s\n" "line 1" "line 2" > bar

$ hexdump foo
0000000 696c 656e 3120 6c0a 6e69 2065 0a32     
000000e

$ hexdump bar
0000000 696c 656e 3120 0a0d 696c 656e 3220 000a
000000f

$ perl -i -pe 'tr/\r//d' bar

$ hexdump bar
0000000 696c 656e 3120 6c0a 6e69 2065 0a32     
000000e
    
por A.B. 24.06.2015 / 10:43