我有一个包含不同文件位置的文件,称为locationfile.txt
它包含:
/home/user/documents/file1
/home/user/file2
/home/user/file3
Run Code Online (Sandbox Code Playgroud)
每个文本文件大约有 10 行,我想将所有文件输出到另一个名为finalfile
.
我发现如果我这样做
cat locationfile.txt | while read line; do cat "$line"; done
Run Code Online (Sandbox Code Playgroud)
这会将所有文件打印在一起,因此它变成了一个 ~30 行的文本文件。
我的问题是,我怎么能吐出那个文件,包括像这样的文本之间的文件位置:
/home/user/documents/file1
text
text
text
""
/home/user/file2
text
text
text
""
/home/user/file3
text
text
text
""
Run Code Online (Sandbox Code Playgroud)
之前cat
做了一个echo
或printf
文件名:
while read line; do printf '%s\n' "$line"; cat "$line"; done <locationfile.txt >finalfile
Run Code Online (Sandbox Code Playgroud)
或者,更具可读性:
while read line; do
printf '%s\n' "$line"
cat "$line"
done <locationfile.txt >finalfile
Run Code Online (Sandbox Code Playgroud)
请注意,这要求所有路径中locationfile.txt
都没有\
。
尽管\
在路径名中使用非常不寻常,但这样做会更安全
while read -r line; do
printf '%s\n' "$line"
cat "$line"
done <locationfile.txt >finalfile
Run Code Online (Sandbox Code Playgroud)
...没有相同的限制。
添加检查以确保文件也确实存在,如果不存在则输出警告:
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
Run Code Online (Sandbox Code Playgroud)
“不存在”在这里的意思是“至少不是一个普通文件”。
如果你也想要""
那里,作为一种文件结束标记,只需将它放在后面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
Run Code Online (Sandbox Code Playgroud)
最后,给事物起一个自我记录的名字:
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
Run Code Online (Sandbox Code Playgroud)
您可以添加echo "$line"
到循环中:
cat locationfile.txt | while read line; do echo "$line" && cat "$line"; done
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
342 次 |
最近记录: |