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