Запуск цикла Bash while для всех похожих файлов

Я хотел бы написать цикл while в Bash, который работает со всеми экземплярами файлов, которые имеют вид

{number}.tst

, например, 1.tst, 2.tst, ... [ 113].

Я не не хочу, чтобы он запускался над файлом tst.tst.

Как мне написать это? Я предполагаю, что мне понадобится логическая фраза и [0-9]* где-то там, но я не совсем уверен в синтаксисе.

7
задан 3 July 2018 в 14:40

4 ответа

Если вам нужно исключить только буквенные имена, подобные вашему примеру 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 ).

8
ответ дан 3 July 2018 в 14:40

Если вы хотите обрабатывать файлы в числовом порядке, есть команда seq (прочтите man seq ).

for i in $( seq 1 50 ) ; do
    echo "Process ${i}.txt"
done
0
ответ дан 3 July 2018 в 14:40

В этом случае имена файлов в форме {число} {не-число} .tst отсутствуют, поэтому одно из возможных решений - включить все имена файлов, которые начинаются с с номером:

for filename in [0-9]*.tst; do
    echo "$filename"  # Example command
done
4
ответ дан 3 July 2018 в 14:40

Из этого ответа на переполнение стека : Список файлов, в именах которых есть только номер :

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 , чтобы перечислить только нумерованные файлы в текущем каталоге, а не в подкаталогах.

6
ответ дан 3 July 2018 в 14:40

Другие вопросы по тегам:

Похожие вопросы: