我有一个文本文件,其中包含项目列表(每行一个),我需要在给定目录中为所述列表中的每个条目创建一个文件;这些文件中的每一个都应使用所述列表中的字符串命名。此外,如果可能的话,在文本文件中包含的字符串之后,应将自定义文本附加到文件名中。
我应该使用哪些命令从命令行执行此操作?我认为cat
,grep
和touch
(也许还有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
。)