Найти все каталоги, которые имеют только один тип файла

491
Jibin

Учитывая тип файла .txt, найдите все каталоги, которые имеют только этот тип файла.

Например

a-- b-- 1.txt c-- | ---- 2.jpg ---- 3.txt 

Команда должна выводить только bнет c.

-1
Пожалуйста, добавьте тег ОС. Для Linux: я бы, вероятно, запустил `find`, получил каталоги-кандидаты, которые по крайней мере содержали этот тип файла, и постобработал бы вывод с помощью скрипта, который проверяет условие" only " dirkt 5 лет назад 0

1 ответ на вопрос

0
Kamil Maciorowski
find . -type d -execdir sh -c ' [ "$(find "$1" -maxdepth 1 -type f -name "*.txt" -print -quit | wc -l)" -gt 0 ] && [ "$(find "$1" -maxdepth 1 -type f ! -name "*.txt" -print -quit | wc -l)" -eq 0 ] ' find-sh {} \; -print 

Каталоги внешних findпоставок для изучения. Два внутренних параметра find-s проверяют, есть ли в .txtкаталоге хотя бы один файл и нет ли других .txtфайлов. shоболочка реализует логику с [ … ]и &&.

Заметки:

  • -maxdepthPOSIX не требуется. Для подхода POSIX см. Этот вопрос .
  • -quitPOSIX не требуется. Это действие findзавершает работу, как только сообщается о любом соответствующем файле. Это полезно, потому что нам нужен не более одного соответствующего файла, чтобы получить результат с, wc -lи [ … ], таким образом, преждевременный выход из него экономит время. Без -quitвсей команды будет работать, она будет медленнее, когда есть много файлов. В качестве альтернативы вы можете использовать find … | head -n 1 | wc -l; в этом случае headпрервет канал после первого найденного файла, сразу же wcвыдаст результат, но findзаметит прерванный канал только тогда, когда (если) попытается написать еще одну строку. И это компромисс: headможет сэкономить вам время и ресурсы, но (как отдельный процесс) требуется время и ресурсы, которые будут порождаться дважды в каждом каталоге.
  • Пути с символами новой строки (если таковые имеются) будут обманывать, wc -lно это не имеет значения, потому что эти дополнительные символы новой строки могут добавить к счету, только если «правильное» число в любом случае ненулевое, и нам нужно только знать, равен ли результат нулю или нет ,

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