Bash 使用GNU find递归创建包含随机内容的文件
我的目的是快速创建一个目录树,如下所示:Bash 使用GNU find递归创建包含随机内容的文件,bash,find,windows-subsystem-for-linux,Bash,Find,Windows Subsystem For Linux,我的目的是快速创建一个目录树,如下所示: . |-- dir1 | |-- 01 | | `-- file_00 | | | |-- 02 | | `-- file_00 | | | |-- 03 | | `-- file_00 | | | |-- 04 | `-- file_00 | `-- dir2 |-- 01 | `-- file_00
.
|-- dir1
| |-- 01
| | `-- file_00
| |
| |-- 02
| | `-- file_00
| |
| |-- 03
| | `-- file_00
| |
| |-- 04
| `-- file_00
|
`-- dir2
|-- 01
| `-- file_00
|
|-- 02
| `-- file_00
|
|-- 03
| `-- file_00
|
`-- 04
`-- file_00
我通过以下方式实现了这一目标:
mkdir {dir1,dir2}
mkdir ./{dir1,dir2}/{01,02,03,04}
touch ./{dir1,dir2}/{01,02,03,04}/file_00
但是当我想附加一个随机数时,$random
足够随机,每个文件都遇到了问题。我试过:
find . -type f -name 'file_00' -exec echo $RANDOM > {} \;
但这在工作目录上创建了一个名为{}
的文件,其随机数重复次数与find
匹配的次数相同(或者我假设是这样)
如何向每个文件\u 00
写入随机数?
/dev/random
在WSL上可用小改进,使用mkdir-p
只需要一个mkdir命令
在-exec指令中调用shell:
find . -type f \
-name file_00 \
-exec bash -c 'for file; do echo $RANDOM > "$file"; done' bash '{}' +
或者只需迭代查找
结果
find . -type f -name file_00 -print0 | while IFS= read -d '' -r filename; do
echo $RANDOM > "$filename"
done
小的改进,使用mkdir-p
,您只需要一个mkdir命令
在-exec指令中调用shell:
find . -type f \
-name file_00 \
-exec bash -c 'for file; do echo $RANDOM > "$file"; done' bash '{}' +
或者只需迭代查找
结果
find . -type f -name file_00 -print0 | while IFS= read -d '' -r filename; do
echo $RANDOM > "$filename"
done
你有一个/dev/random
设备文件吗?不要评论你的问题,但是编辑你的问题来改进它。问题是$random
和{}
都是在find
运行之前由shell解析和应用的;这意味着find
只会看到类似-exec echo 13196\
在其参数列表中,并且find
的输出被重定向到名为“{}”的文件。为了得到你想要的东西,你需要将它们推迟到以后,并将它们分别应用于每个find
finds.@GordonDavisson我得到,$RANDOM
是由shell解释的,但是{}
不是find
匹配项的占位符吗?{}如果find
处理了它,则将是一个占位符,但是shell在find
甚至可以看到它之前解析并删除它。请注意,@glennjackman的解决方案都涉及某种第二级shell解析:shell解析find命令(不计算$RANDOM
或重定向输出)->find
查找匹配文件的列表,并将其传递给另一个shell构造(一个bash-c
子shell或一个while
循环)这将获取文件名,并对每个文件分别执行$RANDOM
和>foundfile
。您是否有/dev/RANDOM
设备文件?不要评论您的问题,而是编辑您的问题以改进它问题是$RANDOM
和{}
都是在运行find
之前由shell解析和应用的;这意味着find
只会看到类似-exec echo 13196\
在其参数列表中,并且find
的输出被重定向到名为“{}”的文件。为了得到你想要的东西,你需要将它们推迟到以后,并将它们分别应用于每个find
finds.@GordonDavisson我得到,$RANDOM
是由shell解释的,但是{}
不是find
匹配项的占位符吗?{}如果find
处理了它,则将是一个占位符,但是shell在find
甚至可以看到它之前解析并删除它。请注意,@glennjackman的解决方案都涉及某种第二级shell解析:shell解析find命令(不计算$RANDOM
或重定向输出)->find
查找匹配文件的列表,并将其传递给另一个shell构造(一个bash-c
子shell或一个while
循环)这将获取文件名,并分别为每个文件执行$RANDOM
和>foundfile
。非常有效,谢谢!)虽然我不明白为什么它以bash'{}+
结尾,但我在+
表单中使用了-exec
子句,这意味着find将把多个文件名放入{}
(查看find手册页)。当您执行bash-c'…'arg1 arg2 arg3…
时,bash将第一个参数作为$0
,第二个参数作为$1
,依此类推。我使用“bash”将我们不关心的东西放入$0
,然后将放入文件;执行…
迭代$1、$2,…非常有效,谢谢!:)虽然我不明白为什么它以bash'{}+
结尾,但我在+
表单中使用了-exec
子句,这意味着find将把多个文件名放入{}
(查看find手册页)。当您执行bash-c'…'arg1 arg2 arg3…
时,bash将第一个参数作为$0
,第二个参数作为$1
,依此类推。我使用“bash”将我们不关心的东西放入$0
,然后将放入文件;执行…
迭代$1、$2、。。。