如何使用“cat”一次写入多个文件?

如何使用“cat”一次写入多个文件?

这个问题和我的有点关系上一个问题

这是以下的输出tree

[xyz@localhost Semester1]$ tree
.
├── Eng
│   ├── credits
│   ├── links
│   └── notes
├── IT
│   ├── credits
│   ├── links
│   └── notes
├── IT_workshop
│   ├── credits
│   ├── links
│   └── notes
├── LA
│   ├── credits
│   ├── links
│   └── notes
├── OS
│   ├── credits
│   ├── links
│   └── notes
├── OS_lab
│   ├── credits
│   ├── links
│   └── notes
├── Psy
│   ├── credits
│   ├── links
│   └── notes
├── Python
│   ├── credits
│   ├── links
│   └── notes
└── Python_lab
    ├── credits
    ├── links
    └── notes

9 directories, 27 files

现在我想提及每门课程在相应文件夹的学分文件中使用的学分数量cat

例如,这是每门课程的学分数:

课程名 制作人员
英格 2
洛杉矶 3
Python 3
操作系统 3
3
IT_workshop 1
Python实验室 1
操作系统实验室 1
心理 2

为了在 Eng/credits 中添加学分详细信息,我需要运行以下命令:

cat >> Eng/credits

并输入学分数(即 2),然后按Ctrl+ D

我必须对其余 8 个文件执行相同的步骤,这似乎是一项乏味的工作。有没有办法使用 一次性完成所有这些cat

我和一些了解 Bash 的朋友交谈过,他们说在我的情况下使用echoor更好printf。为什么会这样?


我期待这样做:

  • 在 Eng/credits 文件中,我希望写入数字 2。
  • 在 LA/学分文件中,我希望写入数字 3。
  • 在 Python/credits 文件中,我希望写入数字 3。
  • 在 OS/credits 文件中,我希望写入数字 3。
  • 在 IT/学分文件中,我希望写入数字 3。
  • 在 IT_workshop/credits 文件中,我想写入数字 1。
  • 在Python_lab/credits 文件中,我想写入数字1。
  • 在 OS_lab/credits 文件中,我想写入数字 1。
  • 在 Psy/credits 文件中,我想写入数字 2。

看完之后钢锯回答,我尝试了这个命令:

echo {2,3,3,3,3,1,1,1,2} >> {Eng/credits,LA/credits,Python/credits,OS/credits,IT/credits,IT_workshop/credits,Python_lab/credits,OS_lab/credits,Psy/credits}

但它并没有像我预期的那样工作:

bash: {Eng/credits,LA/credits,Python/credits,OS/credits,IT/credits,IT_workshop/credits,Python_lab/credits,OS_lab/credits,Psy/credits}: ambiguous redirect

答案1

Cat 用于输出整个文件。它的操作数(非选项参数)是文件。当您这样做时cat >> foo,您将文件 stdout 重定向到foo.

echo 和 printf 获取即时数据。

echo 2 >> foo

...将 2 放入文件中foo

Printf 为您提供了一种向事物添加额外格式的方法,更加标准化,并且在面对未知数据时可能更安全。

答案2

您可能无法使用任何比问题中展示的手动方法更简单的方法使用 cat 来完成此操作。 试试这个:

while read course credit; do
  echo $credit >> $course/credits
done <<EOF
Eng 2
LA 3
Python 3
OS 3
IT 3
IT_workshop 1
Python_lab 1
OS_lab 1
Psy 2
EOF

来自bash 手册页

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

    从标准输入或文件描述符读取一行fd作为参数提供给-u 选项,按照上面的描述分成单词分词,第一个单词被分配给第一个 name,第二个词到第二个词name, 等等。如果单词数多于名称,则剩余的单词及其中间分隔符将分配给最后一个name。如果从输入流中读取的单词少于名称,则其余名称将分配为空值。中的人物 IFS用于使用 shell 用于扩展的相同规则将行拆分为单词(如上所述 分词)。反斜杠字符 (\) 可用于删除读取的下一个字符和行继续的任何特殊含义。选项(如果提供)具有以下含义:
            ︙

read course credit命令会将每行上的第一个单词分配给变量course,然后该行的其余部分(在本例中为数字)分配给变量credit

也来自手册页:

这里的文件

    这种类型的重定向指示 shell 从当前源读取输入,直到一行仅包含 delimiter(没有尾随空白)可见。到该点读取的所有行都将用作标准输入(或文件描述符n如果n被指定)为一个命令。

    这里文档的格式是:

      [n]<<[-]单词
              此处文档
      分隔符

在这种情况下,“单词”和“分隔符”是EOF,“此处文档”是数据。您可以<<EOF用包含数据的文件替换所有内容,并从中重定向标准输入;例如, <data.txt

相关内容