将递增值写入子目录中与文件名匹配的所有文件

将递增值写入子目录中与文件名匹配的所有文件

我正在尝试对一个算法进行多次测试运行,因此有多个目录包含完全相同的数据(子目录和文件),这些目录将在集群上运行。我希望所有这些目录都包含一个名为的文件,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

相关内容