我想制作一些目录树,并用带有随机内容的文本文件填充树的每一端。
这是我到目前为止所尝试的:
#!/bin/bash
set -e
echo "Generating test folders"
mkdir -p ./parent_{0..9}/child_{0..9}
head -c 100 /dev/urandom | xargs echo >> ./parent_{0..9}/child_{0..9}/test.txt
echo "done"
执行时,我收到此错误:
./gen-test.sh: line 8: ./parent_{0..9}/child_{0..9}/test.txt: ambiguous redirect
我做错了什么,什么是更聪明的方法来完成这项任务?
您做错的事情不起作用的原因是因为重定向和文件名生成是由 shell 处理的,而不是由 xargs 处理的。
当你写
然后 shell 将为
foo
您运行,捕获其标准输出,并将其写入foo.out
.如果你跑
然后 shell 将为
foo
您运行,捕获其标准输出,运行xargs
,并将标准输出foo
从xargs
. 在某些时候,xargs
将运行bar
,并将它在标准输入上接收到的数据作为参数传递给它,并且它会以一种导致 的标准输出bar
与 的标准输出无法区分的方式这样做xargs
。shell 将捕获该标准输出,并将其写入bar.out
.您的论点
./parent_{0..9}/child_{0..9}/test.txt
也由 shell 解释。它删除该参数,并将其替换为该模式将生成的文件名,以便mkdir
命令行变为类似(...
为简洁起见添加):稍后,您运行
这意味着您读取 100 字节的随机数据,将其转换为 的命令行参数
echo
,xargs
然后将尝试输出该数据(这不太可能顺利,因为它是二进制数据并且我们正在谈论这里有一个命令行)。最后,shell 看到
>>
,它将其解释为附加重定向,后跟相同的模式;所以这意味着重定向变成但你不能那样做;您一次只能重定向到一个文件(这是您看到的“模糊重定向”错误)。
最简单的解决方法是遍历文件:
因为任何使用 xargs 的解决方案都需要 echo 将命令行参数转换为标准输出,而只能使用 xargs 将相同的标准输出再次转换回命令行参数,这显然是低效的。