Учитывая, что вы не можете изменить myprogram
- его опция -o
всегда будет записывать в файл, указанный в командной строке, и предполагая, что что-то также вне вашего контроля запускает MY_COMMAND
так что вы не можете изменить способ вызова MY_COMMAND
, у вас все еще есть контроль над MY_COMMAND
В остальной части этого ответа я собираюсь изменить имя MY_COMMAND
на callprog
в основном потому, что его легче набирать.
Вы можете определить callprog
как переменную, как в вашем примере export callprog="myprogram -o ./dir/outfile-0.txt"
, но вместо этого вы можете написать сценарий оболочки и имя , которое callprog
и сценарий оболочки может делать практически все, что вы захотите.
Итак, у вас есть каталог, полный outfile-<num>.txt
файлов, и вы хотите вывести на следующий не конфликтующий outfile-<num+1>.txt
.
Ваш сценарий оболочки может получить числа, перечислив файлы, вырезав только числа, отсортировав их, а затем взяв самое большое число.
Если у нас есть эти файлы в dir
:
outfile-0.txt
outfile-1.txt
outfile-5.txt
outfile-10.txt
ls -1 ./dir/outfile*.txt
создает список
./dir/outfile-0.txt
./dir/outfile-1.txt
./dir/outfile-10.txt
./dir/outfile-5.txt
(с использованием outfile
и .txt
означает, что это будет работать, даже если есть другие файлы без имени outfile )
Вычистите номер, отправив его через потоковый редактор sed
... захватите номер и сохраните толькота часть:
ls -1 ./dir/outfile*.txt | sed -e 's:^.*dir/outfile-\([0-9][0-9]*\)\.txt$:\1:'
(я использую двоеточие :
вместо стандартной косой черты /
, поэтому мне не нужно экранировать разделитель каталогов в dir/outfile
)
Теперь вам просто нужно выбрать наибольшее число.Сортируйте числа и возьмите верхнюю
| sort -rn | head -1
Сортировка с помощью -n
является числовой, а не лексикографической сортировкой, -r
переворачивает, поэтому наибольшее число будет первым , а не последним.
Собрав все это вместе, вы получите список файлов, отредактируете имена, сохраняя только числовую часть, отсортируйте и получите только первую запись.Вы хотите присвоить эту переменную для работы с ней, поэтому она выглядит так:
high=$(ls -1 ./dir/outfile*.txt | sed -e 's:^.*dir/outfile-\([0-9][0-9]*\)\.txt$:\1:' | sort -rn | head -1)
В оболочке (я использую bash) вы можете сделать это на математике, $[high + 1]
, так что если high равно 10, выражение выдает 11
Вы можете использовать это как числовую часть вашего имени файла.
Весь сценарий оболочки тогда просто должен использовать это число в имени файла.Вот, с разбитыми линиями для лучшей читабельности:
#!/bin/sh
high=$(ls -1 ./dir/outfile*.txt \
| sed -e 's:^.*dir/outfile-\([0-9][0-9]*\)\.txt$:\1:' \
| sort -rn | head -1)
echo "myprogram -o ./dir/outfile-$[high + 1].txt"
Конечно, вы бы не echo myprogram, вы просто запустили бы ее.