ファイルリストに基づいてファイルの場所と内容を出力する

ファイルリストに基づいてファイルの場所と内容を出力する

次のようなさまざまなファイルの場所を含むファイルがありますlocationfile.txt

/home/user/documents/file1
/home/user/file2
/home/user/file3

各テキストファイルには約10行があり、すべてのファイルをfinalfile

私がそうするなら

cat locationfile.txt | while read line; do cat "$line"; done

これにより、すべてのファイルが一緒に印刷され、約30行のテキストファイルになります。

私の質問は、テキストの間にファイルの場所を含むファイル出力を次のように含めることができる方法です。

/home/user/documents/file1
text
text
text
""
/home/user/file2
text
text
text
""
/home/user/file3
text
text
text
""

答え1

ファイル名に対してOR演算をcat実行する前にecho:printf

while read line; do printf '%s\n' "$line"; cat "$line"; done <locationfile.txt >finalfile

または、読みやすくするには、次の手順を実行します。

while read line; do
  printf '%s\n' "$line"
  cat "$line"
done <locationfile.txt >finalfile

これを行うには、すべてのパスにパスがあってはlocationfile.txtならないことに注意してください\

パス名に含めるのは非常にまれですが、\そうする方が安全です。

while read -r line; do
  printf '%s\n' "$line"
  cat "$line"
done <locationfile.txt >finalfile

...同じ制限はありません。

ファイルが実際に存在することを確認し、存在しない場合に警告を出力するチェックを追加します。

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

ここで「存在しない」とは、「少なくとも一般ファイルではない」を意味する。

""一種のファイルコンテンツ終了タグとして使用するには、次のようにします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

最後に、独自の文書化名を指定します。

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

答え2

while read file; do
    ( echo "$file"; cat "$file"; echo '"""' ) >> /path/to/outputfile
done < /path/to/filelist

答え3

GNU awkがある場合、シェルループを完全に回避するためのオプションは次のとおりです。

xargs -d '\n' -a locationfile.txt gawk 'BEGINFILE{print FILENAME} 1' > newfile

またはGNU sedを使用してください。

xargs -d '\n' -a locationfile.txt sed -s '1F' > newfile

ファイル名の正確な形式に興味がない場合は、次のトリックを使用できますhead

xargs -d '\n' -a locationfile.txt head -vn -0 > newfile

(最初のゼロ以外のすべての行、つまりすべての行を出力するように-n -0指示します。)head

答え4

echo "$line"ループに以下を追加できます。

cat locationfile.txt | while read line; do echo "$line" && cat "$line"; done

関連情報