Grava valor incremental em todos os arquivos que correspondem a um nome de arquivo em subdiretórios

3

Estou tentando fazer várias execuções de teste em um algoritmo e, como tal, ter vários diretórios contendo exatamente os mesmos dados (subdiretórios e arquivos) a serem executados em um cluster. Eu gostaria que todos esses diretórios contivessem um arquivo chamado randomseed.txt , que contém um inteiro único. Atualmente, os arquivos aleatórios existem, mas contêm o mesmo número inteiro: 1. Existe um script bash que eu poderia usar, ou uma variação de find que eu poderia usar para conseguir isso simplesmente?

Minha ideia foi algo assim:

#!/bin/bash

declare -i VAR
VAR=1

find . -type f -name "randomseed.txt" -execdir VAR=$VAR+1 | $VAR > randomseed.txt \;

echo $VAR
echo done

mas não sei ao certo como ou se posso fazer algo assim com -exec ou -execdir .

    
por onyinyang 21.03.2017 / 05:37

3 respostas

4

Isso deve funcionar para você:

/bin/bash
x=1
find . -name 'randomseed.txt' | \
while IFS= read file ; do
  echo $x > "$file"
  x=$(($x+1))
done

IFS= é para impedir a invasão de espaços no caminho do arquivo, se existirem, provavelmente não acontecerá no seu caso.

Os resultados de piping do find no loop while read , que atribui o valor a file , executam o corpo do loop. x=$(($x+1)) é seu% brutox+=1

    
por Bradley Kennedy 21.03.2017 / 06:19
3

Execute um loop criando números e tenha o comando find -executed lendo esses números:

for ((i = 1; ; i++)); do echo $i; done | 
  find . -type f -name "randomseed.txt" -exec sh -c 'read i; echo $i > "$1"' _ {} \;

Você também pode usar seq :

seq 1 inf | find . -type f -name "randomseed.txt" -exec sh -c 'read i; echo $i > "$1"' _ {} \;
    
por muru 21.03.2017 / 08:34
3

Em vez de usar find , você pode ativar o globstar para tornar a globalização de shell recursiva.

 shopt -s globstar

cd para o diretório pai dessa estrutura e, em seguida, para testar (por cima) a gravação dos arquivos:

n=0; for i in **; do [[ -d "$i" ]] && echo "echo $((++n)) >" "$i"/randomseed.txt; done

Você pode ver que vai gravar um arquivo em cada diretório em todos os níveis. Você pode então remover o eco extra para realmente gravar os arquivos:

n=0; for i in **; do [[ -d "$i" ]] && echo $((++n)) > "$i"/randomseed.txt; done

Você pode querer desfazer globstar quando terminar:

shopt -u globstar
    
por Zanna 21.03.2017 / 08:03