如何在 Linux 下创建以文本文件中的行命名的文件

如何在 Linux 下创建以文本文件中的行命名的文件

我有一个文本文件,其中包含项目列表(每行一个),我需要在给定目录中为所述列表中的每个条目创建一个文件;这些文件中的每一个都应使用所述列表中的字符串命名。此外,如果可能的话,在文本文件中包含的字符串之后,应将自定义文本附加到文件名中。

我应该使用哪些命令从命令行执行此操作?我认为catgreptouch(也许还有xargs?)应该参与该过程,但经过几次尝试,我仍然找不到正确的语法。

有人可以告诉我这件事吗?

答案1

假设你有list.txt这样的情况:

file 1
file 2
file 3

你可以通过以下方式实现你想要的:

while read FILE; do touch "${FILE} some string"; done < list.txt

答案2

因此你得到一个list包含以下内容的文件:

this
that
the-other

并且您想要为该文件中的每一行创建一个文件,其名称在该行中给出。这非常简单 – 当且仅当每行仅由一个单词组成时:

cat list | xargs touch --

--告诉touch不要尝试将其后的任何内容解析为参数;如果没有它,如果您有类似的文件名-this,则前导-将使 touch 混淆,认为“t”,“h”,“i”和“s”是参数,而不是要 touch 的文字文件名的一部分。)

这就是解决的简单情况,但这不是您所要求的;如果您希望文件名包含 中行指定内容以外的文本list,事情会变得更加复杂;xargs 无法进行这种插值。相反,您需要类似以下内容(这要求您的 shell 是bash,这是大多数系统的标准):

for file in `cat list`; do touch -- $file-customtext; done

请注意,这仍然只在每行仅由一个单词组成时才有效。在此命令中,$file被 中给定行上指定的文件名替换list;其周围的所有内容均按字面意思理解,因此此命令与list上述内容结合使用将创建以下文件:

this-customtext
that-customtext
the-other-customtext

当然,您可以用任何您喜欢的内容替换“-customtext”,并且您还可以使用前缀和后缀;do touch -- some-$file-text例如,如果您有,它也可以正常工作,并导致名为some-this-text&c 的文件。

现在,假设的内容list不是那么简单——具体来说,它们包含空格、非单词字符或其他 shell 无法正确解释的内容。如果你问三个人在这种情况下他们会推荐什么,你可能会得到五个答案;我是一个 Perl 黑客,所以我的答案是 Perl。具体来说,让我们假设list包含以下内容的 a:

This is the first line
of three (three?) lines
in the list file.

我这样做的方式是:

cat list | perl -ne'chomp; system(qq|touch -- "custom $_ text"|)'

生成结果文件如下:

custom This is the first line text
custom of three (three?) lines text
custom in the list file. text

在这种情况下,自定义文本可以是任何你喜欢的文本,包括空格等,只要它既不包含"(会混淆touch)也不包含'(会混淆perl);在 Perl 命令中,$_表示来自 的给定行的内容list,自定义文本可以位于其之前或之后,但位于双引号内。(双引号外的自定义文本将被看作touch一个单独的文件名,除非它包含会导致错误的内容,否则将按字面意思创建该文件名touch。)

相关内容