1

Я использую Bash для Mac OS X 10.6.8.

Используя команду find , я бы хотел найти файлы, которые соответствуют *.XML Однако я хотел бы сопоставить только те файлы в 16xxxx а не 16yyyy из некоторого базового каталога.

basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML
basedir/16yyyy/EX3.XML
basedir/16yyyy/EX4.XML

Результаты, которые я ищу, будут EX1.XML и EX2.XML (полное имя исключено для ясности).

Это в контексте скрипта BASH, который сделал бы удобным, если бы я мог ввести 16xxxx/*.XML как выражение для передачи -name в команде find :

find basedir -name '16xxxx/*.XML'

Однако это не возвращает совпадений, поскольку оболочка не соответствует символу / . Есть ли какой - нибудь аргумент , чтобы пройти , чтобы find или способ избежать 16xxxx/\*.XML выражение, которое будет возвращать результаты, которые мне нужны?

1 ответ1

4

Опция -name никогда не будет работать после первого / . Как всегда, man- страницы ваших друзей:

 -path pattern
         True if the pathname being examined matches pattern.  Special shell pattern matching characters
         (``['', ``]'', ``*'', and ``?'') may be used as part of pattern.  These characters may be
         matched explicitly by escaping them with a backslash (``\'').  Slashes (``/'') are treated as
         normal characters and do not have to be matched explicitly.

Я обычно предпочитаю совместимость с GNU find и поэтому использую опцию -wholename . Не то, что они также существуют в нечувствительном к регистру режиме: -iwholename и -ipath .

Так что в вашем случае вы бы это сделали (помните, что wholename соответствует всему пути, поэтому вы должны добавить подстановочный знак * в начале):

karolos$ find basedir -type f
basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML
basedir/16yyyy/EX3.XML
basedir/16yyyy/EX4.XML
karolos$ find basedir -wholename "*16xxxx/*.XML"
basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML

Другой способ добиться того, чего вы хотите, - это использовать find в сочетании с grep (обратите внимание, что мне пришлось изменить регулярное выражение, добавив . (Для любого символа) перед подстановочным знаком *):

karolos$ find basedir | grep '16xxxx/.*.XML'
basedir/16xxxx/EX1.XML
basedir/16xxxx/EX2.XML

Наконец, в зависимости от ваших потребностей, даже существует вероятность, что вам даже не нужно использовать find (если вам не нужна дополнительная гибкость). Затем вы можете использовать расширение имени файла bash следующим образом:

karolos$ echo basename/*16x*/*XML
basename/16xxxx/EX1.XML basename/16xxxx/EX2.XML

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