Substitua as novas linhas char (^ M) em todos os arquivos e renomeie o arquivo com base na cadeia char

1

Eu não sou um cara do UNIX, mas entendo o suficiente para criar pequenos roteiros aqui e ali, exceto por este em que eu pessoalmente não consiga dedicar tempo suficiente.

Eu tenho cerca de 2000 arquivos em um diretório em que o seguinte precisa ser feito:

  1. Cada arquivo tem cerca de 3000 registros, mas todos estão em uma linha de cada arquivo separado pelo caractere de nova linha Ctrl M. Estes precisam ser separados.
  2. Cada arquivo tem a data correspondente em que foi gerado na primeira linha, começando do 8º caractere ao 14º caractere. Essa data precisa ser usada para renomear o arquivo para XXX_YYYYMMDD_AAA.txt
por user3073169 06.10.2014 / 00:25

1 resposta

1

A maioria dos sistemas inclui uma ferramenta chamada dos2unix , que você pode "preparar" em um script para processar os arquivos necessários para executar essa operação.

Se os arquivos estiverem todos em um diretório, você pode usar find para localizá-los e depois operar em cada um individualmente assim:

$ find . -type f -exec dos2unix {} +

Exemplo

Digamos que eu tenha essa estrutura de diretórios

$ tree
.
|-- afile
|-- dir1
|   '-- afile
'-- dir2
    '-- afile

Podemos usar nossa técnica find para confirmar que todos os arquivos são arquivos "DOS" com a terminação de linha CRLF.

$ find . -type f -exec file {} +
./dir2/afile: ASCII text, with CRLF line terminators
./afile:      ASCII text, with CRLF line terminators
./dir1/afile: ASCII text, with CRLF line terminators

E corrija tudo assim:

$ find . -type f -exec dos2unix {} +
dos2unix: converting file ./dir2/afile to Unix format ...
dos2unix: converting file ./afile to Unix format ...
dos2unix: converting file ./dir1/afile to Unix format ...

Resultando em apenas arquivos Unix:

$ find . -type f -exec file {} +
./dir2/afile: ASCII text
./afile:      ASCII text
./dir1/afile: ASCII text
    
por 06.10.2014 / 02:55