Исключить все подкаталоги из find

Из man apt-cache :

команда madison в apt-cache пытается имитировать выходной формат и подмножество функций управления архивом Debian инструмент, Мэдисон. Он отображает доступные версии пакета в табличном формате. В отличие от исходного Madison, он может отображать информацию только для архитектуры, для которой APT имеет извлеченные списки пакетов (APT :: Architecture)

0
20.09.2018, 22:30
2 ответа

Вы пробовали смотреть руководство?

Вариант, который вы ищете, это -maxdepth, как уже написал @StevenPenny.

Одна из причин, по которой результатов нет, (из руководства)

If the whole expression contains no actions other than -prune or -print, -print is performed on all files for which the whole expression is true.

Так как ваши варианты включают -prune, неявного -printнет. Ваша команда удалит только каталоги с именем *.out.

Если вы действительно хотите использовать -prune, сделайте это:

find "$dir"/* -type d -prune -o -name '*.out' -print

Обратите внимание, что здесь используется "$dir"/*, потому что "$dir"— это каталог, который будет удален. Это сводит на нет преимущество find, заключающееся в том, что он не ограничен максимальной длиной аргумента

.
1
28.01.2020, 02:18

Кажется, что здесь вообще не нужно find.

for pathname in "$dir"/*.out; do
    [ ! -f "$pathname" ] && continue

    # do whatever you need to do to "$pathname" here
done

После теста -f"$pathname"будет указывать на обычный файл или на символическую ссылку на обычный файл. Обратите внимание, что скрытые файлы будут пропущены, поскольку *не соответствует именам файлов, начинающимся с точки (, если только в bashне установлен параметр оболочки dotglob, который вы можете использовать или не использовать ).

Сfind:

find "$dir" -mindepth 1 -type d -prune -o -type f -name '*.out' -print

-mindepth 1приводит к тому, что начальный каталог не обрезается с помощью -type d -prune. -printследует заменить действием, которое вы хотели бы выполнить с найденными путями (, которые будут относиться к обычным файлам с именами, заканчивающимися на.out).

Или,

find "$dir" ! -path "$dir" -type d -prune -o -type f -name '*.out' -print

При этом используются только стандартные findпараметры и удаляются все каталоги, которые не совпадают с начальным путем.

Как вариант,

find "$dir" -maxdepth 1 -type f -name '*.out' -print

Использование -maxdepth 1проще говоря, остановило бы findот спуска в любой из подкаталогов начального каталога.

Опции -mindepthи -maxdepth, хотя и широко доступны, являются расширениями стандартной команды find, и если в вашей реализации findих нет, вам придется используйте цикл оболочки или альтернативу find, которая использует -pruneтолько (с-path).

2
28.01.2020, 02:18

Теги

Похожие вопросы