将每个文本文件的名称附加到文件的最后一行

ked*_*ink 3 scripts text-processing 20.04

我有十个文件:firstFile.txt,...,tenthFile.txt

在文件的最后一行,我想附加文件名。

即对于第一个,最后一行将是firstFile

我想用一行代码执行此操作。

我是个新手,所以不知道该尝试什么,我的猜测是这样的echo * >> *.txt,但并不感到惊讶,因为它不起作用

Zan*_*nna 14

例如,可以通过使用for循环来实现这一点,其语法如下:

for var in values; do things; done
Run Code Online (Sandbox Code Playgroud)

此代码将列表中的第一个值values放入varthings对其执行,然后将下一个值放入var,依此类推。

我们经常使用它对一堆文件执行相同的操作,就像您想要在此处执行的操作一样。

您可以使用一些合适的表达式让 Bash 创建文件列表(值列表,正如我上面所说的那样)。这里我建议你使用*File.txt. shell 会将其扩展为当前目录中以File.txt. 所以你的代码的第一位可能是

for f in *File.txt; do
Run Code Online (Sandbox Code Playgroud)

您可以为f变量使用其他名称,例如file. 我建议使用小写字母或单词(shell 中已经使用大写单词定义了其他变量,我们不想覆盖它们)。当我们在 Bash 中调用变量时,我们在其名称前面加上$. $f因此,您可以使用或引用变量$file,shell 会将其扩展为该变量的当前值。为了防止结果进一步扩展,我们几乎总是使用双引号,所以$f我不会写 ,而是"$f"在调用变量时写。

要将一些文本发送到文件中,您可以使用简单的工具,例如printfecho重定向。您已经证明您知道如何使用重定向将内容附加到文件。这:替换的内容并附加到。stuff > filefilestuffstuff >> filestufffile

我们应该非常小心重定向,因为我们可以很容易地覆盖我们的重要文件 - 您甚至不会收到有关它的警告。因此,在运行如此强大的命令之前,您可能需要在另一个目录中备份文件,和/或进行一次试运行,仅检查将要操作的文件,如下所示:

for f in *File.txt; do echo "$f"; done
Run Code Online (Sandbox Code Playgroud)

上面只是返回将要操作的文件列表。

那么让我们回到如何向文件添加文本。由于我们的变量中已经有文件名,因此我们可以使用它来生成文本。

以下是您的代码的外观echo

for f in *File.txt; do echo "$f" >> "$f"; done
Run Code Online (Sandbox Code Playgroud)

对于firstFile.txt,它将运行echo firstFile.txt >> firstFile.txt,依此类推,对于 匹配的所有其他文件*File.txt

但您提到您的文件以以下结尾.txt,并且您不希望将其出现在附加文本中。

为了避免这种情况,您可以执行一些字符串操作

for f in *File.txt; do echo "${f%.*}" >> "$f"; done
Run Code Online (Sandbox Code Playgroud)

这将从中的字符串的最后${f%.*}一个字符开始修剪字符,在本例中为..$f.txt

您也可以使用printf. 它值得学习,因为它比 更灵活echo,而且据我所知,也更可靠。

for f in *File.txt; do printf '%s\n' "${f%.*}" >> "$f"; done
Run Code Online (Sandbox Code Playgroud)

'%s\n'用于格式化 -%s意味着文本是字符串(例如,不是数字)并\n在其后附加换行符(echo自动附加换行符)。

  • @Zanna,这可能是一个提及 bash shell 的“nullglob”选项的好机会。顺便说一句,很好的答案。 (3认同)