Procura por texto num ficheiro, depois renomeia o ficheiro com esse texto

7

Temos vários relatórios de trabalho de um sistema que salvam em nosso servidor Linux com o prefixo O*****.TXT . Dentro do arquivo está o ID do processo do relatório.

Qual script posso executar para pesquisar todos os arquivos 'O****.TXT em um diretório e renomear cada arquivo com o ID do processo de cada arquivo? por exemplo:

Pesquise OAAJWNZN.TXT por ProcID:0000019324 , renomeie OAAJWNZN.TXT para 0000019324.TXT .

Depois que esse arquivo for renomeado, o script será movido para o próximo arquivo no diretório e fará o mesmo.

    
por IanG 22.12.2016 / 11:25

3 respostas

7

Um comando awk que lê o arquivo e o renomeia:

awk -F '[:)]' '/ProcID/{printf "echo mv %s %s.txt\n", FILENAME,  | "/bin/sh"; nextfile}' O*.TXT

Como a linha ProcID é, na verdade:

JOB 04508907 (ProcID:0000019324) START AT 22.12.2016 / 09:10:45

Para extrair o I, P, precisamos dividir em : e ) , o que nos dará 0000019324 como o segundo campo.

Remova echo para realmente executar o movimento. Use isto somente se os nomes dos arquivos e ProcID não contiverem espaços ou caracteres especiais.

Esse comando obtém o ProcID dividindo em : para obter o segundo campo e, em seguida, usa-o e a variável especial FILENAME para construir o comando. A documentação do GNU awk sugere o método printf ... | "/bin/sh" . Então nós pulamos para o próximo arquivo.

    
por muru 22.12.2016 / 12:04
6

Você pode usar for , rename e sed no diretório onde os arquivos estão:

for i in O*.TXT; do rename -n "s/.*\.TXT/$(sed -nr 's/.*( |^)ProcID:([0-9]+)( |$).*//p' "$i").TXT/" "$i"; done

Remover -n após rename após o teste para realmente renomear os arquivos

Explicação

  • for i in O*TXT; do faça algo com todos os arquivos correspondentes
  • rename -n apenas informa quais serão os novos nomes, na verdade, não os renomeie ainda (remova -n após o teste)
  • "s/old/new/" replace old com new (use aspas duplas em vez de aspas simples para podermos passar variáveis com $ de expansão)
  • $(command) substituição de comando - passa a saída de command para outra coisa
  • .*\.TXT corresponde a qualquer caractere seguido por literal . e, em seguida, TXT
  • sed invoca nosso amigo sed para ler o arquivo e extrair coisas dele
  • -n não imprime nada até pedirmos
  • -r usa ERE, por isso, não é necessário escapar de () ou +
  • ( |^) space ou início da linha
  • ProcID:([0-9]+) pelo menos um dígito depois de ProcID ... salve o número para depois
  • ( |$) espaço ou fim de linha
  • de volta ao padrão salvo anteriormente com ()
  • p imprime o resultado depois da edição
por Zanna 22.12.2016 / 11:44
4
  1. Percorra os arquivos.
  2. Você pode usar o grep para encontrar o ProcID
  3. Mova o arquivo para o novo nome de arquivo

Faça um cp em vez de mv se quiser manter os arquivos antigos ou não tiver certeza.

for file in 0*.TXT; do
  procid=$(grep -Po "(?<=ProcID:)[0-9]*" "$file");
  new_filename="/outputpath/${procid}.TXT";
  if [ ! -f "$newfilename" ]; then
    mv "$file" "$new_filename";
  fi;
done
    
por RoVo 22.12.2016 / 11:42