我正在尝试对一个算法进行多次测试运行,因此有多个目录包含完全相同的数据(子目录和文件),这些目录将在集群上运行。我希望所有这些目录都包含一个名为的文件,randomseed.txt
其中包含一个唯一的整数。目前,随机种子文件存在,但包含相同的整数:1. 有没有我可以使用的 bash 脚本,或者find
我可以使用它的变体来简单地实现这一点?
我的想法是这样的:
#!/bin/bash
declare -i VAR
VAR=1
find . -type f -name "randomseed.txt" -execdir VAR=$VAR+1 | $VAR > randomseed.txt \;
echo $VAR
echo done
但我不完全确定如何或是否可以使用-exec
或做这样的事情-execdir
。
答案1
这应该对你有用:
/bin/bash
x=1
find . -name 'randomseed.txt' | \
while IFS= read file ; do
echo $x > "$file"
x=$(($x+1))
done
IFS=
是为了防止文件路径中存在空格而中断,在您的情况下可能不会发生这种情况。
将 find 的结果放入 while 循环中read
,然后赋值给循环体,file
然后运行循环体。x=$(($x+1))
这是你的毛病x+=1
答案2
运行一个循环创建数字并让find
执行命令读取这些数字:
for ((i = 1; ; i++)); do echo $i; done |
find . -type f -name "randomseed.txt" -exec sh -c 'read i; echo $i > "$1"' _ {} \;
您还可以使用seq
:
seq 1 inf | find . -type f -name "randomseed.txt" -exec sh -c 'read i; echo $i > "$1"' _ {} \;
答案3
除了使用find
,您还可以打开 globstar 来使 shell 通配符递归。
shopt -s globstar
cd
到此结构的父目录,然后测试(覆盖)写入文件:
n=0; for i in **; do [[ -d "$i" ]] && echo "echo $((++n)) >" "$i"/randomseed.txt; done
您可以看到它将在每个级别的每个目录中写入一个文件。然后您可以删除多余的 echo 来实际写入文件:
n=0; for i in **; do [[ -d "$i" ]] && echo $((++n)) > "$i"/randomseed.txt; done
完成后你可能需要取消设置 globstar:
shopt -u globstar