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

Sek*_*mty 8 linux file-management command-line

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

我应该使用哪些命令从命令行执行此操作?我想cat,greptouch(也许xargs?)应该参与到这个过程中,但经过几次试验后,我仍然找不到正确的语法。

有人可以启发我吗?

cYr*_*rus 11

说你有list.txt这样的:

file 1
file 2
file 3
Run Code Online (Sandbox Code Playgroud)

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

while read FILE; do touch "${FILE} some string"; done < list.txt
Run Code Online (Sandbox Code Playgroud)


Aar*_*ler 9

所以你有一个list包含以下内容的文件:

this
that
the-other
Run Code Online (Sandbox Code Playgroud)

并且您想为该文件中的每一行创建一个具有该行指定名称的文件。这很简单——当且仅当每行只包含一个单词:

cat list | xargs touch --
Run Code Online (Sandbox Code Playgroud)

--告诉touch不要尝试将其后的任何内容解析为参数;没有它,如果您有像 那样-this的文件名,则前导-会将触摸混淆为认为 't'、'h'、'i' 和 's' 的意思是参数,而不是要触摸的文字文件名的一部分。)

这是处理的简单案例,但这不是您要问的;如果您希望文件名包含一些超出 中行指定内容的文本list,事情会变得更加复杂;xargs 不能做那种插值。相反,您需要类似以下内容(这要求您的 shell 是bash,这是大多数系统上的标准):

for file in `cat list`; do touch -- $file-customtext; done
Run Code Online (Sandbox Code Playgroud)

请注意,这仅在每行仅包含一个单词时才有效。在此命令中,$file被替换为在给定行中指定的文件名list;它周围的一切都是字面意思,因此带有上述list内容的命令将创建以下文件:

this-customtext
that-customtext
the-other-customtext
Run Code Online (Sandbox Code Playgroud)

当然,你可以用你喜欢的任何东西替换“-customtext”,你也可以有前缀和后缀;do touch -- some-$file-text例如,如果您改为使用,它也能正常工作,并生成名为some-this-text&c 的文件。

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

This is the first line
of three (three?) lines
in the list file.
Run Code Online (Sandbox Code Playgroud)

我这样做的方式是:

cat list | perl -ne'chomp; system(qq|touch -- "custom $_ text"|)'
Run Code Online (Sandbox Code Playgroud)

产生结果文件:

custom This is the first line text
custom of three (three?) lines text
custom in the list file. text
Run Code Online (Sandbox Code Playgroud)

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