Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用GNU find递归创建包含随机内容的文件_Bash_Find_Windows Subsystem For Linux - Fatal编程技术网

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、。。。