我在 OS X 终端中尝试执行以下操作:
我有一个包含多行文本的 .txt 文件。我希望每一行都成为一个文件。
我通过以下方式实现了此目的:cat file.txt | xargs touch
这会生成我的文件列表,但我需要它们包含某种内容,而不是空白的。
有人能帮我用一个命令生成列表中的文件并且每个文件里面只有一行文本吗?
就像命令 echo 'Hello, world.' >foo.txt 在 foo.txt 中创建文本一样,但情况与我描述的一样。这可能吗?
提前致谢!
/尼克拉斯
答案1
1.简单的方法:
echo 'Hello, world.' > foo.txt
< file.txt xargs -L 1 cp foo.txt
rm foo.txt
该cat
命令被过度使用;当您看到 时,您可以将其更改为或等效地。选项告诉它一次只读取一行;因此,如果包含和(在不同的行上),则将运行cat filename | command
command < filename
< filename command
-L 1
xargs
file.txt
file.txt
file1
file2
xargs
cp foo.txt file1
cp foo.txt file2
我认为其余部分是不言自明的。如果你想把这些都放在一行上,只需用以下代码连接这些行&&
:
echo 'Hello, world.' > foo.txt && xargs -L 1 cp foo.txt < file.txt && rm foo.txt
我将其移至命令< file.txt
的末尾xargs
,这也是人们通常放置它的位置。
2. 更加灵活
您可能想要做一些比向每个文件写入相同的一行更复杂和更复杂的操作。此命令:
xargs sh -c 'for f do echo "Hello, world." > "$f"; done' sh < file.txt
将文件名传递给 shell 的调用 ( sh
),然后 shell 可以对指定的文件(引用为"$f"
)执行任何可以从 shell 提示符执行的操作。而且,显然,使用此方法,您不需要创建和删除临时文件。
3. 不使用xargs
你可以将上述内容简化为
while IFS= read -r f
do
echo 'Hello, world.' > "$f"
done < file.txt
这与上一个答案基本相同,只是这次 shell 读取文件file.txt
,因此不需要xargs
。