У меня есть скрипт, который работает следующим образом для одного файла.
./script 0001g.log > output
для двух или более файлов, например, этот
./script 0001g.log 0002g.log 0003g.log > output
Скрипт берет одно специальное число из каждого входного файла и помещает его в один выходной файл.
Мой вопрос: у меня есть 1000 входных файлов, как мне организовать цикл для выполнения моего скрипта?
решение1
У вас есть несколько возможных решений:
Просто
$ ./script *g.log >output
... и надеюсь, что это *g.log
не расширится до чего-то, что сделает командную строку слишком длинной. Это не очень надежно.
Если ваш скрипт не зависит от количества переданных ему файлов, т. е. если вывод можно просто добавить к output
каждому входному файлу, то это еще одно решение:
$ find ./ -type f -name "*g.log" | xargs ./script >output
Третьим решением было бы перенести цикл в сам скрипт:
for f in *g.log; do
# old code using "$f" as file name
done
Здесь нет проблем с ограничением длины командной строки, поскольку это скрипт.
Вызов скрипта теперь будет
$ ./script >output
решение2
если
./script 0001g.log 0002g.log 0003g.log > output
экв.
./script 0001g.log > output
./script 0002g.log >> output
./script 0003g.log >> output
тогда вы можете использовать цикл или
`seq -f '%04gg.log' 10` | script > output
решение3
Если хотите, можете поместить файлы в каталог
/opt/location/source
/0001g.log
/0002g.log
/0003g.log
Затем в вашем bash-скрипте вы можете попробовать следующее
#!/bin/bash
# store path to files
SOURCE="/opt/location/source/"
# loop through files
for FILE in `ls $SOURCE*g.log`; do
# do what you want to specific file
echo $FILE
done