web-dev-qa-db-ja.com

サブディレクトリ内のファイル名に一致するすべてのファイルに増分値を書き込みます

私はアルゴリズムで多数のテストを実行しようとしています。そのため、クラスターで実行されるのとまったく同じデータ(サブディレクトリとファイル)を含む多数のディレクトリがあります。これらのディレクトリすべてに、一意の整数を含む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を使用してこのようなことをどのように、またはできるかは完全にはわかりません。

3
onyinyang

これはあなたのために働くはずです:

_/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_

4
Maeve Kennedy

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
3
Zanna

番号を作成するループを実行し、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"' _ {} \;
3
muru