Я хотел бы написать цикл while в Bash, который работает со всеми экземплярами файлов, которые имеют вид
{number}.tst
, например, 1.tst
, 2.tst
, ... [ 113].
Я не не хочу, чтобы он запускался над файлом tst.tst
.
Как мне написать это? Я предполагаю, что мне понадобится логическая фраза и [0-9]*
где-то там, но я не совсем уверен в синтаксисе.
Если вам нужно исключить только буквенные имена, подобные вашему примеру tst.tst
, вы можете использовать простую оболочку glob
for f in [0-9]*.tst; do echo "$f"; done
с расширенным bash globs (который должен быть включен по умолчанию в Ubuntu)
задан
$ ls *.tst
1.tst 2.tst 3.tst 4.tst 50.tst 5.tst bar.tst foo.tst
, тогда + ([0-9])
означает одну или несколько десятичных цифр:
for f in +([0-9]).tst; do echo "$f"; done
1.tst
2.tst
3.tst
4.tst
50.tst
5.tst
Вы можете проверить, есть ли расширенное глобирование включается с помощью shopt extglob
и при необходимости устанавливается с помощью shopt -s extglob
(и отменяется с помощью set -u extglob
).
Если вы хотите обрабатывать файлы в числовом порядке, есть команда seq
(прочтите man seq
).
for i in $( seq 1 50 ) ; do
echo "Process ${i}.txt"
done
В этом случае имена файлов в форме {число} {не-число} .tst отсутствуют, поэтому одно из возможных решений - включить все имена файлов, которые начинаются с с номером:
for filename in [0-9]*.tst; do
echo "$filename" # Example command
done
Из этого ответа на переполнение стека : Список файлов, в именах которых есть только номер :
find . -regex '.*/[0-9]+\.tst'
ИЛИ
Использование find также имеет преимущества, когда вы хотите что-то сделать с файлами, например используя встроенный -exec
, -print0
и канал к xargs -0
или даже (используя Bash):
while IFS='' read -r -d '' file
do
# ...
done < <(find . -regex '.*/[0-9]+\.tst' -print0)
Обратите внимание на другие ответы здесь мои включать файлы, которые не являются числами, если имя файла начинается с цифры. Однако ответ, размещенный здесь, не имеет. Например:
$ ls *.tst
12tst.tst 1.tst 2.tst
$ find . -maxdepth 1 -regex '.*/[0-9]+\.tst'
./1.tst
./2.tst
ПРИМЕЧАНИЕ: Используйте аргумент -maxdepth 1
, чтобы перечислить только нумерованные файлы в текущем каталоге, а не в подкаталогах.