Sua pergunta é um pouco confusa:
- Você está usando
!
para representar seu prompt de shell? Isso é atípico. - Você está falando sobre todos os arquivos
.txt
no 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.txt
irá 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
.