LINUX.ORG.RU

матчинг путей


0

1

привет!

вопросов, на самом деле, два.

1. правильно ли утверждение, что пути '/1/.' и '/1/1.txt' матчатся на '/1/*' ?

2. правильно ли утверждение, что содержимое директории '/1' читается из '/1/.' ?

зы: второй вопрос относится больше к девелопменту.

спасибо.

★★★

Ответ на: комментарий от niXman

а какой путь будет матчится?

Только второй. Для первого нужен паттерн /1/.* либо shopt -s dotglob для баша, например.

а откуда?

Директория - это, по сути, файл на диске, ибо «всё - файл». Файл/директория имеет inode, в которой хранится вся соответствующая информация. Путь разрешается обычными способами, потом определяется инода для этого пути и дальше система работает с содержимым иноды.

E ★★★
()
Ответ на: комментарий от E

Только второй. Для первого нужен паттерн '/1/.*'

так это ведь паттерн который говорит, что, ему соответствует любой файл, имя которого начинается с точки?

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

перефразирую вопрос.

есть такая структура каталогов: '/1','/1/1.txt','/1/1','/1/1/1.txt'

каким должен быть паттерн, чтоб он соответствовал двум последним путям, но не двум первым?

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

А . и .. начинаются с точки, внезапно. Хотя я в своё время тоже был удивлён после перехода с винды.

есть такая структура каталогов: '/1','/1/1.txt','/1/1','/1/1/1.txt'
каким должен быть паттерн, чтоб он соответствовал двум последним путям, но не двум первым?

В общем случае вообще так нельзя, потому что /1/1 и /1/1/1.txt находятся на разном уровне. Но можно с помощью паттерна ** (recursive glob) для баша версии >=4:

$ shopt -s globstar # для включения рекурсивного глоба
$ tree 1
1
├── 1
│   └── 1.txt
└── 1.txt

1 directory, 2 files
$ echo 1/1/**
1/1/  1/1/1.txt

E ★★★
()
Ответ на: комментарий от E

А . и .. начинаются с точки, внезапно.

та я не об этом =)

я о том, что еще ведь могут быть файлы/директории с именами начинающимися с точек '.1.txt', etc...

В общем случае вообще так нельзя, потому что /1/1 и /1/1/1.txt находятся на разном уровне.

ок. тогда, к примеру, в псевдоусловии, это будет верно? если нет - то как правильно?

ok = !(filename match "/1/*" and filename not match "/1/1/*")

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

я о том, что еще ведь могут быть файлы/директории с именами начинающимися с точек '.1.txt', etc...

Такие считаются «скрытыми».

anonymous
()
Ответ на: комментарий от anonymous

та понятно же. я же не об этом, а о самом факте, что имена файлов/директорий могут начинаться с символа точки.

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

Неправильно упростил. Погугли правило де Моргана.

я о том, что еще ведь могут быть файлы/директории с именами начинающимися с точек '.1.txt', etc...

Могут, ну и что? Если нужно ловить единственный файл '.', то паттерн и будет '.'. Если нужны символы подстановки, то нужно включить dotglob. Если ты хочешь найти паттерн, который сматчит '/1/.' и '/1/1.txt', то в общем случае так сделать нельзя, ибо даже dotglob не разрешает через '/1/*' найти '/1/.', файл «точка» - это виртуальный файл, физически его не существует, поэтому и обрабатывается он костыльно.

Если ты хочешь находить файлы из субдиректории, _включая_ эту субдиректорию, и не хочешь всё, что выше её, то тебе либо globstar (как в примере выше), либо просто возьми содержимое субдиректории и добавь к нему саму субдиректорию вручную:

ls /1/1 /1/1/*

Можно ещё взять find:

$ tree 1
1
├── 1
│   └── 1.txt
└── 1.txt

1 directory, 2 files
$ find 1/1
1/1
1/1/1.txt

Иначе пора признаваться, для чего тебе это нужно вообще.

E ★★★
()
Ответ на: комментарий от E

Неправильно упростил. Погугли правило де Моргана.

знаю я эти правила. в чем я ошибся?

остальное слабо относится к сабжу.

повторю вопрос: есть такая структура каталогов:

'/1'
'/1/1.txt'
'/1/1'
'/1/1/1.txt'
каким должен быть паттерн(на псевдоусловном языке), чтоб он соответствовал двум последним путям, но не двум первым?

niXman ★★★
() автор топика

всем спасибо, вопрос закрыт.

niXman ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.