Antes do cat fazer um echo ou printf do nome do arquivo:
while read line; do printf '%s\n' "$line"; cat "$line"; done <locationfile.txt >finalfile
Ou mais legível:
while read line; do
printf '%s\n' "$line"
cat "$line"
done <locationfile.txt >finalfile
Observe que isso exige que todos os caminhos em locationfile.txt não tenham \ neles.
Embora ter \ em nomes de caminho seja altamente incomum, seria mais seguro fazer
while read -r line; do
printf '%s\n' "$line"
cat "$line"
done <locationfile.txt >finalfile
... que não tem as mesmas restrições.
Adicionando uma verificação para garantir que o arquivo também exista e emitindo um aviso, caso contrário:
while read -r line; do
if [[ -f "$line" ]]; then
printf '%s\n' "$line"
cat "$line"
else
printf 'Warning: "%s" does not exist\n' "$line" >&2
fi
done <locationfile.txt >finalfile
"Não existe" aqui significa "pelo menos não é um arquivo regular".
Se você quiser também o "" , como uma espécie de marcador de conteúdo de final de arquivo, basta colocar isso em branco depois de cat :
while read -r line; do
if [[ -f "$line" ]]; then
printf '%s\n' "$line"
cat "$line"
echo '""'
else
printf 'Warning: "%s" does not exist\n' "$line" >&2
fi
done <locationfile.txt >finalfile
E, finalmente, dê nomes de autodocumentação:
while read -r file_path; do
if [[ -f "$file_path" ]]; then
printf '%s\n' "$file_path"
cat "$file_path"
echo '""'
else
printf 'Warning: "%s" does not exist\n' "$file_path" >&2
fi
done <file_paths.txt >files_concat_with_paths.txt