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