次のようなさまざまなファイルの場所を含むファイルがあります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