Я пытаюсь сделать, много тестовых прогонов на алгоритме и как таковой имеют много каталогов, содержащих точно те же данные (подкаталоги и файлы), чтобы быть выполненными на кластере. Я хотел бы, чтобы все эти каталоги содержали названный файл 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
.
Это должно работать на Вас:
/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
Выполните цикл, создающий числа, и имейте 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"' _ {} \;
Вместо того, чтобы использовать 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