1

Работает нормально:

==> scp my_log-bin.01393[0-9] root@192.168.103.66:/backup/  

ошибка - нет такого файла или каталога:

==> scp my_log-bin.0139[30-99] root@192.168.103.66:/backup/ 

5 ответов5

2

Помимо [0-9] вы можете использовать фигурные скобки и ... обозначения.

scp my_log-bin.0139{30..99} root@192.168.103.66:/backup/
1

[30-99] в обозначении типа оболочки ("glob") означает « 3 , или цифра в диапазоне 0-9 , или 9 », т.е. это то же самое, что и [0-9] .

Что вы хотите

# build list of files; note, won't work when filename contains a space or colon
files=""
for i in `seq 30 99`; do
    files="$files my_log-bin.$i"
done

scp $files root@192.168.103.66:/backup/
1

bash(1) реализует диапазоны [n-m] для расширений имен файлов аналогично регулярным выражениям - диапазон представляет один символ:

$ for i in `seq 1 100` ; do touch $i ; done
$ ls
1    13  18  22  27  31  36  40  45  5   54  59  63  68  72  77  81  86  90  95
10   14  19  23  28  32  37  41  46  50  55  6   64  69  73  78  82  87  91  96
100  15  2   24  29  33  38  42  47  51  56  60  65  7   74  79  83  88  92  97
11   16  20  25  3   34  39  43  48  52  57  61  66  70  75  8   84  89  93  98
12   17  21  26  30  35  4   44  49  53  58  62  67  71  76  80  85  9   94  99
$ echo [0-9]
1 2 3 4 5 6 7 8 9
$ echo [30-99]
1 2 3 4 5 6 7 8 9

Также работает с буквами:

$ touch a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo [f-l]
f g h i j k l

Полная информация с man-страницы:

   [...]  Matches any one of the enclosed characters.  A pair of
          characters separated by a hyphen denotes a range
          expression; any character that sorts between those two
          characters, inclusive, using the current locale's
          collating sequence and character set, is matched.  If
          the first character following the [ is a !  or a ^
          then any character not enclosed is matched.  The
          sorting order of characters in range expressions is
          determined by the current locale and the value of the
          LC_COLLATE shell variable, if set.  A - may be matched
          by including it as the first or last character in the
          set.  A ] may be matched by including it as the first
          character in the set.

          Within [ and ], character classes can be specified
          using the syntax [:class:], where class is one of the
          following classes defined in the POSIX standard:
          alnum alpha ascii blank cntrl digit graph lower print
          punct space upper word xdigit
          A character class matches any character belonging to
          that class.  The word character class matches letters,
          digits, and the character _.

          Within [ and ], an equivalence class can be specified
          using the syntax [=c=], which matches all characters
          with the same collation weight (as defined by the
          current locale) as the character c.

          Within [ and ], the syntax [.symbol.] matches the
          collating symbol symbol.
0

Проблема с оболочкой решена хорошо, но если основной проблемой является копирование только новых файлов, я решаю эту проблему с помощью rsync:

rsync --progress -tvprogul my_log-bin.* root@192.168.103.66:/backup/

и пусть rsync определит, какие файлы уже находятся там.

0

Извлечение будет обрабатываться вашей оболочкой.

Если ваша оболочка bash, [] соответствует любому из вложенных символов, а [30-99] не соответствует двум символам.

Как насчет использования следующего вместо:

scp my_log-bin.0139[3-9][0-9] root@192.168.103.66:/backup/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .