基于文件列表的输出文件位置和内容

use*_*145 5 linux sed awk cat

我有一个包含不同文件位置的文件,称为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)

Kus*_*nda 8

之前cat做了一个echoprintf文件名:

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)


pbm*_*pbm 2

您可以添加echo "$line"到循环中:

cat locationfile.txt | while read line; do echo "$line" && cat "$line"; done
Run Code Online (Sandbox Code Playgroud)