Текстовая спецификация для дерева файлов? - PullRequest
4 голосов
/ 27 декабря 2008

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

Вот пример возможного синтаксиса:

*.py *.html
*.txt *.js
-*.pyc
-.svn/
-*combo_*.js

(это будет означать включение файла с расширениями .py .html .txt .js, исключение файлов .pyc, что-либо в каталоге .svn и любой файл, соответствующий combo_ .js)

Я знаю, что раньше видел подобные спецификации в других инструментах. Это звонит кому-нибудь в колокола?

Ответы [ 7 ]

4 голосов
/ 27 декабря 2008

Не существует единого стандартного формата для такого рода вещей, но если вы хотите скопировать что-то, что является общепризнанным, взгляните на rsync документацию . Посмотрите на главу «ВКЛЮЧИТЬ / ИСКЛЮЧИТЬ ПРАВИЛА ШАБЛОНА».

2 голосов
/ 27 декабря 2008

Apache Ant предоставляет 'муравьиные шарики или узоры где:

**/foo/**/*.java

означает «любой файл, заканчивающийся на« .java »в каталоге, который включает в себя каталог с именем« foo »в своем пути», включая ./foo/X.java

1 голос
/ 27 декабря 2008

Если вы используете bash, вы можете использовать расширение extglob, чтобы получить некоторые полезные функции. Включите его следующим образом:

shopt -s extglob

Тогда вы можете сделать что-то вроде следующего:

# everything but .html, .jpg or ,gif files
ls -d !(*.html|*gif|*jpg)
# list file9, file22 but not fileit
ls file+([0-9])
# begins with apl or un only
ls -d +(apl*|un*)

См. Также эту страницу .

1 голос
/ 27 декабря 2008

В вашем примере синтаксиса неявно ли понимается, что есть экранирующий символ, так что вы можете явно включить файл, начинающийся с тире? (Тот же вопрос относится и к любым другим символам подстановки, но я полагаю, что я ожидаю увидеть больше файлов с тире в их именах, чем звездочек.)

Различные командные оболочки используют * (и, возможно,?, Чтобы соответствовать одному символу), как в вашем примере, но они обычно совпадают только со строкой символов, которая не включает разделитель компонентов пути (то есть '\' в Windows системы, '/' в другом месте). Я также видел, что такие приложения управления исходным кодом, как Perforce, используют дополнительные шаблоны, которые могут совпадать с разделителями компонентов пути. Например, с Perforce шаблон "foo / ... ext" (без кавычек) будет соответствовать всем файлам в структуре каталога foo /, которые заканчиваются на "ext", независимо от того, находятся ли они в самом foo / или в одном из его каталоги потомков. Кажется, это полезный шаблон.

1 голос
/ 27 декабря 2008

Как насчет find в среде unixish?

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

NAME найти - пройти файловую иерархию

СИНТАКСИС найти [-H | -L | -P] [-EXdsx] [-f путь] имя пути ... выражение найти [-H | -L | -P] [-EXdsx] -f путь [путь] ... выражение

ОПИСАНИЕ Утилита find рекурсивно спускает дерево каталогов для каждого путь указан в списке, оценивая выражение (состоит из primaries'' and операнды, перечисленные ниже) в терминах каждого файла в дереве.

для достижения вашей цели я бы написал что-то вроде (отформатировано для удобства чтения):

find ./ \( -name *.{py,html,txt,js,pyc} -or \
           -name *combo_*.js -or \
           \( -name *.svn -and -type d\)\) \
           -print

Более того, существует логический паттерн, использующий xargs, который делает find подходящим для отправки всего списка, сконструированного произвольной командой, например:

find /path -type f -print0 | xargs -0 rm
0 голосов
/ 27 декабря 2008

Возможно, вы захотите проверить ack , который позволяет указывать типы файлов для поиска с параметрами, такими как --perl и т. Д.

Он также игнорирует каталоги .svn по умолчанию, а также дампы ядра, редактора, двоичные файлы и т. Д.

0 голосов
/ 27 декабря 2008

find(1) - прекрасный инструмент, описанный в предыдущем ответе, но если он усложняется, вам следует либо написать собственный сценарий для любого из обычных подозреваемых (Ruby, Perl, Python и др.), Либо попробовать используйте одну из более мощных оболочек, такую ​​как zsh, которая имеет команды ** globbing, и вы можете указать, что исключить. Последнее, вероятно, более сложное.

...