Я работаю над проектом с открытым исходным кодом. В большинстве, но не во всех подкаталогах глубины 1 можно найти файл с именем «test.c». Как я могу узнать те каталоги, в которых нет «test.c»?
Например, у меня есть подкаталоги dir1, dir2, dir3. Dir2 и dir3 имеют «test.c». Я должен вручную проверить их с помощью «ls», чтобы определить, что «dir1» не имеет «test.c». Возможно, есть более простой способ (например, команда bash) сделать это? Я работаю под Ubuntu 16. Поэтому предпочтительнее использовать команду bash.
Вы можете использовать эту команду find
из базового каталога всех подкаталогов:
find . -type d -exec bash -c 'for d; do [[ -f "$d"/test.c ]] || echo "$d"; done' - {} +
Эта команда находит все подкаталоги из текущего каталога и проверяет наличие файла test.c
в каждом каталоге в команде bash. Если файл отсутствует, печатается имя каталога.
Вы можете использовать -maxdepth 1
, чтобы ограничить глубину до 1. [[ -f "$d"/test.c ]]
— это условие, которое возвращает успех test.c
в каталоге $d
. || echo
выполняет echo
команду, когда условие не выполнено, поэтому она выполняется echo
, когда файл отсутствует.
Еще одна вещь: что означает «- {} +»?
- {}
— аргументы для bash -c
командной строки. -
используется в качестве фиктивного аргумента для $0
, а {}
— имя текущего каталога из команды find
, которая используется в качестве оставшихся аргументов в командной строке bash -c
.
Спасибо за ответ. Я понимаю синтаксис «найти», но не могли бы вы немного объяснить часть после -exec? В частности, я хотел бы ограничить поиск каталогами на глубине 1. Как бы я сделал это с помощью вашей команды?