Не используйте eval
, если у вас нет другой альтернативы. Это потенциально опасно, в зависимости от содержимого переменных $start
и $stop
. Не стоит привыкать использовать его там, где он не нужен.
Не используйте вывод ls
ни для чего, кроме просмотра в терминале. Попытка разобрать ls
, даже самым простым способом, может привести к неудаче во многих отношениях. Используйте любое , которое может создать список имен файлов, разделенных NUL -, вместо:find -print0
часто является хорошим выбором.
bash, встроенный -в расширение последовательности {x..y}
, не может оценивать переменные, но отдельная программа seq
может принимать переменные в качестве аргументов. Он также имеет полезную опцию -s
для указания разделителя.
Для следующего требуется версия grep
, которая поддерживает параметр -z
для разделенных входных записей NUL -(, например. GNU, FreeBSD и большинство других современных версий grep
).
# build a regular expression matching the desired sequence
re="$(seq -s '|' "$start" "$stop")"
# use the RE with `find... -print0` and `grep -E -z -c`
find /home/me/*/ -maxdepth 1 -type f -name 'file_*.txt' -print0 |
grep -Ezc "/file_($re)\.txt$"
Например, если start=3
и stop=7
, то $re
будет 3|4|5|6|7
. Затем команда grep
расширится до :
grep -Ezc "/file_(3|4|5|6|7)\.txt$"
Кстати, аргументы -name 'file_*.txt'
для команды find
не требуются.Их можно отбросить, и конвейер все равно будет работать без ошибок. Все, что они делают, это сокращают входные данные, которые необходимо обработать с помощью grep
. В лучшем случае очень незначительная оптимизация.
напр.
find /home/me/*/ -maxdepth 1 -type f -print0 | grep -Ezc "/file_($re)\.txt$"