Sua pergunta é um pouco confusa:
- Você está usando
!para representar seu prompt de shell? Isso é atípico. - Você está falando sobre todos os arquivos
.txtno diretório/data/files? Para fazer isso, você deve dizer/data/files/*.txt. Se você quer dizer algo mais por/data/files *.txt, por favor explique. -
>> mergedfile.txtirá anexar os arquivos amergedfile.txt, se já existe. É isso que você quer? Se você quiser algo assim, você deve dizer isso em sua pergunta.
De qualquer forma, conforme declarado da Arrow em um comentário ,
A solução simples e óbvia é substituir o | por um ; , assim:
$ cat /data/files/*.txt >> mergedfile.txt; wc -l mergedfile.txt
Notas:
- Como afirmei acima,
>>acrescenta os arquivos amergedfile.txt, se já existirem. Se você quiser ignorar (descartar) qualquer conteúdo anterior demergedfile.txt, use>em vez de>>. - Se você fizer referência ao mesmo arquivo várias vezes, você deve fazer isso da mesma maneira todas as vezes. Usando um nome de caminho relativo uma vez e um nome de caminho absoluto na próxima vez é confuso e propenso a erros. (Você pode querer simplificar as coisas atribuindo o nome do arquivo a uma variável.)
Uma ligeira melhoria em relação ao acima é:
$ cat /data/files/*.txt > mergedfile.txt && wc -l mergedfile.txt
com && em vez de ; .
Isso faz com que o comando wc -l seja executado
somente se o comando cat for bem-sucedido.
Cada uma das linhas de comando acima é caracterizada como uma "lista de comandos", contendo dois “pipelines” (embora não existam tubos reais envolvidos). Se você quiser fazer isso como um único "pipeline", faça isso:
$ cat /data/files/*.txt | tee mergedfile.txt | wc -l
que conta as linhas enquanto concatena os arquivos,
eliminando a necessidade de ler o arquivo de saída.
Se você deseja anexar a um mergedfile.txt existente, use tee -a .