Edit: melhor solução que produz os nomes dos arquivos de saída desejados
Fazendo uso de ls
, awk
e cat
:
ls | awk '! /\([0-9]+\)/ {match($0, /Txt_BI_ProfilesBI_Profile_Export_([^.]+)/,matches); system("cat " $0 "* >"matches[1] ".txt")}'
Solicitado pela exibição de Matthew sobre os poderes de Powershell, eu tinha para mostrar que o mesmo pode ser alcançado em um ambiente festivo. Essa é apenas uma das muitas maneiras, como é comum no mundo do UNIX.
Explicação:
ls
lista todos os elementos no diretório atual
awk
linguagem de programação projetada para processamento de texto
! /\([0-9]+\)/
exclui nomes de arquivos que contêm um número entre parênteses
match($0, /Txt_BI_ProfilesBI_Profile_Export_([^.]+)/,matches)
executa uma correspondência de expressão regular no nome do arquivo, capturando a parte entre o prefixo comum e o primeiro ponto
system("
executa um comando do sistema
cat " $0 "*
concatenam arquivos que começam com o nome de arquivo
>"matches[1] ".txt"
output para um arquivo chamado como a expressão capturada e com uma extensão .txt
Primeira resposta:
Você pode usar find
, xargs
, bash
e cat
:
find . -type f -regextype sed ! -regex "\./.*([0-9]\+)" | xargs -I{} bash -c 'cat {}* > {}.txt'
Esta é mais uma prova de conceito e pode ser refinada, já que os nomes dos arquivos de saída não são exatamente o que você procurava, mas devem ser suficientes para resolver seu problema imediatamente.
Explicação:
find .
pesquisa o diretório atual
-type f
procura por arquivos
-regextype sed
usa o mecanismo de expressões regulares com sintaxe compatível com sed
! -regex "\./.*([0-9]\+)"
exclui resultados que correspondem à expressão regular especificada, ou seja, aqueles que incluem um número entre parênteses no final
| xargs
usa cada resultado para construir um comando
-I{}
no comando a seguir, substitua {}
por cada find
result
bash -c
passa a seguinte string como um comando para bash
'cat {}* > {}.txt'
concatena os arquivos que começam com o nome do arquivo encontrado em um arquivo que possui um nome composto pelo resultado find
e a extensão .txt