Работа с масками имен файлов/каталогов

Маски имен файлов - удобный и простой инструмент для "фильтрации" данных. С помощью масок легко указать - какие файлы и каталоги надо обрабатывать, а какие следует "пропустить" при обработке. В работе с масками пять "тонкостей":

  1. бывают маски имени файла (-m, -x) и имени каталога (-dm, -dx)
  2. маски бывают включающими (-m, -dm) и исключающими (-x, -dx)
  3. в качестве маски можно использовать не только метасивол '*', но и регулярные выражения (regex)
  4. в качестве аргумента для опций -m, -dm, -x и -dx в командной строке можно указывать несколько масок через запятую или имя текстового файла, в котором находится набор масок (синтаксис @filename). При этом маски имени файла и маски имени каталога можно использовать одновременно.
  5. в понятие "маска имени файла/каталога" может входить не только имя файла/каталога, но и его относительный путь (считая от исходного каталога)

Сначала разберемся с первым пунктом. Бывают случаи, когда удобно разделить маски на маски имен файлов и имен каталогов. Например, мы хотим скопировать все *.htm файлы из каталога c:\data и всех его подкаталогов. Нет ничего проще, воспользуемся включающей маской имени файла:

nnbackup.exe -i c:\data -o d:\backup -s -m *.htm

Расшифровка: копировать все htm-файлы из каталога c:\data и всех его подкаталогов в каталог d:\backup.

А как быть, если мы при этом хотим исключить подкаталог c:\data\wrong_data из обработки? Вот тут, как раз и приходит на помощь исключающая маска имени подкаталога:

nnbackup.exe -i c:\data -o d:\backup -s -m *.htm -dx "wrong_data"

Расшифровка: копировать все htm-файлы из каталога c:\data и всех его подкаталогов (кроме подкаталога c:\data\wrong_data) в каталог d:\backup.

Второй пункт. Как вы уже поняли из предыдущего примера, маски могут быть включающими и исключающими. Работа с исключающими масками не вызовет затруднений: копируются все файлы, кроме тех, что подпадают под исключающую маску. Например:

nnbackup.exe -i c:\data -o d:\backup -x *.txt

Расшифровка: копировать все файлы кроме файлов с расширением txt из каталога c:\data в каталог d:\backup.

Включающая маска, напротив, определяет какие именно файлы должны копироваться:

nnbackup.exe -i c:\data -o d:\backup -m *.htm*

Расшифровка: копировать только файлы с расширением htm и html из каталога c:\data в каталог d:\backup.

Включающие и исключающие маски можно использовать одновременно.

Переходим к третьему пункту. Самые простые маски - это маски созданные с помощью символа '*', который заменяет собой любое количество любых букв и цифр. Скажем, под маску '*test' подпадут слова 'test', 'contest', '123test', но не подпадет словa 'test123' и 'test_one'. Ну, а под маску '*test*' подпадут все слова указанные в предыдущем примере и все остальные слова, начинающиеся с 'test', содержащие 'test' внутри или заканчивающиеся на 'test'.

В качестве маски можно использовать не только метасивол '*', но и т. н. регулярные выражения (regex) - мощное средство составления шаблонов, с помощью которых в заданном тексте может проводиться поиск и сопоставление символов любой сложности. С синтаксисом регулярных выражений можно поближе познакомиться здесь. Чтобы задать маску с помощью регулярных выражений, просто окружите ее символами '/' (прямой слеш) - '/.../'.

nnbackup.exe -i c:\data -o d:\backup -m "/\d*\.htm/"

Расшифровка: копировать только файлы с расширением htm и именем, состоящим из любого количества цифр, из каталога c:\data в каталог d:\backup.

Четвертый пункт. В качестве аргументов к опциям -m, -dm, -x и -dx в командной строке можно указывать сразу несколько масок через запятую:

nnbackup.exe -i c:\data -o d:\backup -m *.htm*,*.css,*.gif,*.jpeg

Расшифровка:копировать из каталога c:\data в каталог d:\backup файлы с расширениями htm, html, css, gif и jpeg.

nnbackup.exe -i c:\data -o d:\backup -x *.txt,*.doc,*.rtf,*.pdf

Расшифровка: копировать из каталога c:\data в каталог d:\backup все файлы, кроме файлов с расширениями txt, doc, rtf и pdf.

В качестве аргумента для опций -m, -dm, -x и -dx в командной строке можно указывать имя текстового файла, в котором находится набор масок. В качестве разделителя используется перевод строки. Например, мы можем создать текстовой файл doc.msk с таким содержимым:

*.txt
*.doc
*.rtf
*.pdf

Теперь имя этого файла можно использовать в качестве аргумента для опций -m, -dm, -x и -dx:

nnbackup.exe -i c:\data -o d:\backup -m @doc.msk

Расшифровка:копировать из каталога c:\data в каталог d:\backup файлы с расширениями txt, doc, rtf и pdf.

nnbackup.exe -i c:\data -o d:\backup -x @doc.msk

Расшифровка: копировать из каталога c:\data в каталог d:\backup все файлы, кроме файлов с расширениями txt, doc, rtf и pdf.

Возможность считывать маски из текстового файла бывает очень полезной, когда приходится часто использовать одни и теже "наборы" масок или когда список файлов для обработки генерируется специальной внешней программой.

Вот еще один пример текстового файла с масками - в нем собраны временные файлы, индексы, а также маски, включающие каталоги:

*.~*
*.bkp
*.bak
*.nsx *.ntx *.idx
*\temp*\* *\external*\*

Обратите внимание, что маски имени файла и маски имени каталога можно использовать одновременно, например для того, чтобы исключить один или несколько каталогов:

nnbackup.exe -i c:\data -o d:\backup -s -m *.htm -dx "wrong_*,*temp*"

Расшифровка: копировать все htm-файлы из каталога c:\data и всех его подкаталогов (кроме подкаталогов, начинающихся с 'wrong_' и подкаталогов, содержащих в имени 'temp') в каталог d:\backup.

Ну, и последний, пятый пункт: в понятие "маска имени файла/каталога" может входить не только имя файла/каталога, но и его относительный путь (считая от исходного каталога). Это предоставляет пользователю дополнительную свободу при создании масок. Правила здесь простые: если в созданной вами маске имени файла/каталога присутствует символ '\' (обратный слеш), то вся маска сравнивается с относительным путем. Если обратного слеша в маске нет, то она сравнивается только с именем файла/каталога.

Учитывание относительного пути в маске позволяет включать/исключать целые подкаталоги и файлы, которые в них содержатся. Например, если в каталоге с:\data есть подкаталог images, то я могу задать такую маску:

nnbackup.exe -i c:\data -o d:\backup -m *.exe,*images\* -s

Расшифровка: копировать все исполняемые файлы и все содержимое каталога images из каталога c:\data и всех его подкаталогов в каталог d:\backup.

При включении/исключении целых каталогов бывает удобно пользоваться и включающими и исключающими масками одновременно. Модифицируем предыдущий пример, чтобы из подкаталога images не копировались файлы с расширением bmp:

nnbackup.exe -i c:\data -o d:\backup -m *.exe,*images\* -x *images\*.bmp -s

Расшифровка: копировать все исполняемые файлы и все содержимое каталога images (кроме файлов с расширением bmp) из каталога c:\data и всех его подкаталогов в каталог d:\backup.