findutils 4.4.x в Ubuntu не позволяет мне указать параметр `глубины`

Миссия: перечислить всех прямых потомков каталога, которые являются самим каталогом.

На BSD (Mac OS), find . -type d -depth 1 работает.

Это вывод Ubuntu 12.04 (GNU findutils 4.4.2):

$ find . -type d -depth 1
find: warning: you have specified the -depth option after a non-option argument -type,
but options are not positional (-depth affects tests specified before it as well as 
those specified after it).  Please specify options before other arguments.

find: paths must precede expression: 1
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Хорошо, следующая попытка:

$ find . -depth 1 -type d
find: paths must precede expression: 1
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Хм, ну, может быть, он хочет...

$ find -depth 1 . -type d
find: paths must precede expression: 1
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Видимо, нет, WTF, если это нужно...

$ find . -depth=1 -type d
find: unknown predicate `-depth=1'

Нет, это было очевидно Итак, давайте попробуем в крайнем случае...

$ find . -mindepth 1 -maxdepth 1 -type d
<my directories>

Удачи, успехов! Но почему...?

И, в качестве дополнительного вопроса, почему -mindepth 1 -maxdepth 1 намного быстрее чем -depth 1 на BSD / OSX?

2 ответа

Решение

-depth опция не принимает аргумент:

-depth Process each directory's contents before the directory itself.

Варианты как -name, -type ожидайте, что последует что-то, это не относится к -depth, Это больше логический вариант.

Разные версии find использовать -depth Первоначально означать совершенно разные вещи:

  • -depth означает выполнить поиск в глубину (то есть посетить содержимое до самого каталога). Это отличается от большинства праймериз, так как не определяет, какие файлы совпадают, а как выполняется поиск. Насколько я знаю, все версии find поддержать это.

  • -depth n означает сопоставлять только элементы на глубине n (то есть то, что вы хотите). Это совершенно другое значение от -depth когда за ним не следует число, которое может быть очень запутанным. Кроме того, не все версии find поддерживает это (OS X делает, GNU findutils, очевидно, не делает).

-find n Первичный полезен, но, к сожалению, не переносим. Если вам нужна мобильность, я думаю, что вы застряли с -mindepth n -maxdepth n,

Другие вопросы по тегам