Запишите, что постепенное увеличение оценивает всем файлам, соответствующим имени файла в подкаталогах

Я пытаюсь сделать, много тестовых прогонов на алгоритме и как таковой имеют много каталогов, содержащих точно те же данные (подкаталоги и файлы), чтобы быть выполненными на кластере. Я хотел бы, чтобы все эти каталоги содержали названный файл randomseed.txt который содержит уникальное целое число. В настоящее время randomseed файлы существуют, но содержат то же целое число: 1. Есть ли сценарий удара, из которого я мог использовать, или изменение 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
задан 21 March 2017 в 10:06

3 ответа

Это должно работать на Вас:

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

IFS= должен предотвратить повреждение на пробелах в пути к файлу, если они будут существовать, то вероятно, не произойдет в Вашем случае.

результаты Передачи по каналу находки в цикл с условием продолжения read, который присваивает значение file затем тело цикла выполнений. x=$(($x+1)) Ваше общее количество x+=1

4
ответ дан 1 December 2019 в 13:08

Выполните цикл, создающий числа, и имейте 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
ответ дан 1 December 2019 в 13:08

Вместо того, чтобы использовать find, Вы могли включить globstar для создания оболочки globbing рекурсивной.

 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
ответ дан 1 December 2019 в 13:08

Другие вопросы по тегам:

Похожие вопросы: