Se você observar a saída de find -name "data.csv"
, verá que ela imprime os nomes completos dos arquivos chamados data.csv
. O pipeline passa isso para sed
, que imprime a segunda linha de sua entrada.
Então o que você está dizendo é: "Aqui está uma lista de arquivos. Dê-me o segundo da lista." O que você realmente quer dizer é "Aqui está uma lista de arquivos. Para cada um, me dê a segunda linha". E para isso, você quer usar xargs
.
Provavelmente, você precisará de
find -name "data.csv" -print0 | xargs -0 -n 1 sed -n 2p > final.csv
Geralmente, é uma boa ideia usar find -print0 | xargs -0
: o -print0
faz com que find
use caracteres NUL como separadores entre nomes de arquivos em vez de uma nova linha e -0
informa xargs
a esperar isso. Isso evita que nomes de arquivos com espaços, retornos ou outros caracteres estranhos atrapalhem seu pipeline.
O -n 1
informa xargs
para executar um processo sed
separado para cada arquivo "data.csv" que encontrar, em vez de tentar agrupá-los em conjunto, o que geralmente torna as coisas mais eficientes. Neste caso, se você executar
sed -n 2p file1 file2 file3
ele internamente concatenará todos os seus arquivos de entrada em um fluxo de entrada e imprimirá a segunda linha dele. Mas RTFM: pode haver uma maneira de fazer sed
não fazer isso, que eu perdi.