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

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

Não sou um cara de UNIX, mas entendo o suficiente para criar pequenos scripts aqui e ali, exceto este, onde pessoalmente posso não conseguir dedicar tempo suficiente.

Tenho cerca de 2.000 arquivos em um diretório no qual o seguinte precisa ser feito:

  1. Cada arquivo tem cerca de 3.000 registros, mas todos estão em uma linha de cada arquivo separados pelo caractere de nova linha Ctrl M. Eles precisam ser separados.
  2. Cada arquivo tem a data correspondente em que foi gerado na primeira linha, começando do 8º ao 14º caracter. Esta data precisa ser usada para renomear o arquivo para XXX_YYYYMMDD_AAA.txt

Responder1

A maioria dos sistemas inclui uma ferramenta chamada dos2unixque você pode "iniciar" em um script para processar os arquivos necessários para executar esta operação.

Se os arquivos estiverem todos em um diretório, você poderá findlocalizá-los e operar cada um individualmente, assim:

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

Exemplo

Digamos que eu tivesse essa estrutura de diretórios

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

Podemos usar nossa findtécnica para confirmar que todos os arquivos são arquivos "DOS" com 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 repare 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 apenas em arquivos Unix:

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

informação relacionada