find. -type d -exec sh -c ' dirpath=$1 set -- "$dirpath"/*.md [ -f "$dirpath/${dirpath##*/}.md" ] && [ "$#" -eq 1 ]' sh {} \; -print
Приведенный выше код найдет все каталоги ниже текущего каталога (, включая текущий каталог ), и для каждого из них будет выполнен короткий сценарий оболочки.
Шелл-код будет проверять, существует ли уцененный файл с тем же именем, что и у каталога внутри каталога, и является ли это единственным
*.md
именем в этом каталоге. Если такой файл существует и если это единственное имя*.md
, встроенный сценарий оболочки завершается с нулевым статусом выхода. В противном случае он завершается с не--нулевым статусом выхода (, сигнализируя о сбое ).Бит
set -- "$dirpath"/*.md
установит позиционные параметры в список имен путей, соответствующих шаблону (соответствует любому имени с суффиксом.md
в каталоге ). Затем мы можем использовать$#
позже, чтобы увидеть, сколько совпадений мы получили от этого.Если сценарий оболочки завершится успешно,
Немного более быстрая версия, использующая меньше вызовов встроенного скрипта,но это не позволяет вам делать больше с найденными путями в самом
find
(хотя встроенный скрипт может быть дополнительно расширен):find. -type d -exec sh -c ' for dirpath do set -- "$dirpath"/*.md [ -f "$dirpath/${dirpath##*/}.md" ] && [ "$#" -eq 1 ] && printf "%s\n" "$dirpath" done' sh {} +
Те же команды, но не заботясь о том, есть ли другие
.md
файлы в каталогах:find. -type d -exec sh -c ' dirpath=$1 [ -f "$dirpath/${dirpath##*/}.md" ]' sh {} \; -print
find. -type d -exec sh -c ' for dirpath do [ -f "$dirpath/${dirpath##*/}.md" ] && printf "%s\n" "$dirpath" done' sh {} +
См. также: