2015-06-09 2 views
0

Я хочу написать функцию, которая найдет файлы в текущем каталоге, в котором я сейчас. Дело в том, что если я в /home, я хочу найти файлы в sys, dev и var (что находится в моей домашней папке). Но если я в корневой папке, я хочу, чтобы их раздели. Я пробовал:Как игнорировать каталог в поиске по полному пути

find -L . \(-path '/dev' -o -path '/var' -o -path '/sys' \) -prune \ 
    -o -type f -print \ 
    -o -type d -print \ 
    -o -type l -print 

Но его не работает. Если я устанавливаю точку (.) В начале каждого пути, который я хочу исключить, он работает для корневой папки, но также исключает такие директории в других каталогах, чего я не хочу.

Есть ли способ обрезать полный (глобальный) путь к файлу? Я попробовал вариант -wholename, но, похоже, для меня это не работает.

+0

Пропущено ли пробелы между '' sys'' и закрывающим парелем или артефактом вашего сообщения? –

+0

Кроме того, «путь» полностью не связан с путями файловой системы; это относится к алгоритмам искусственного интеллекта. В то время как тег «find» перегружен, он действительно лучше, чем «поиск пути» для этого запроса. –

+0

Кстати, поскольку вы пишете функцию, почему бы не поставить условную логику в самой функции? –

ответ

2

Вы можете использовать find "$PWD", как в find "$PWD" -path '/dev' -prune -o -print, для поиска в текущем каталоге по абсолютной траектории. После этого пройдут совпадения с абсолютным контуром.

+0

Теперь я чувствую себя крайне глупо. –

+0

@CharlesDuffy: P –

+0

Это работало как шарм, спасибо большое) – sandric

0

-path не считает /dev и ./dev быть такой же, даже при работе в /, потому что find выполняет сравнение строк на имена при использовании -path - это не поиск номеров индексных дескрипторов для сравнения или выполнить нормализацию.

Теперь, если вы do хотите сделать поиск на основе индексов, вы можете это сделать.

Рассмотрим:

# this relies on GNU stat for --format 
listtree() { 
    find -L . \(-inode "$(stat --format=%i /dev)" \ 
      -o -inode "$(stat --format=%i /var)" \ 
      -o -inode "$(stat --format=%i /sys) \) -prune \ 
    -o -type f -print \ 
    -o -type d -print \ 
    -o -type l -print 
} 

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