私はアルゴリズムで多数のテストを実行しようとしています。そのため、クラスターで実行されるのとまったく同じデータ(サブディレクトリとファイル)を含む多数のディレクトリがあります。これらのディレクトリすべてに、一意の整数を含む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
を使用してこのようなことをどのように、またはできるかは完全にはわかりません。
これはあなたのために働くはずです:
_/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
_
find
を使用する代わりに、globstarをオンにして、Shellグロビングを再帰的にすることができます。
shopt -s globstar
cd
をこの構造の親ディレクトリに追加してから、ファイルをテスト(上書き)します:
n=0; for i in **; do [[ -d "$i" ]] && echo "echo $((++n)) >" "$i"/randomseed.txt; done
各レベルの各ディレクトリにファイルを書き込むことがわかります。その後、余分なエコーを削除して、実際にファイルを書き込むことができます。
n=0; for i in **; do [[ -d "$i" ]] && echo $((++n)) > "$i"/randomseed.txt; done
終了したら、globstarの設定を解除することができます。
shopt -u globstar
番号を作成するループを実行し、find
- executedコマンドにそれらの番号を読み取らせます。
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"' _ {} \;