Найти каталоги / w файлы с 2 различными расширениями

290
Dulanic

Поэтому я пытаюсь думать, как я могу это сделать. Например, я могу найти файлы с этим, но на самом деле мне нужны каталоги, которые содержат оба типа файлов. Есть идеи?

Кроме того, мне все равно, что это за имя файла, просто каталог содержит файл / w с обоими расширениями.

find . -type f \( -name "*.ext1" -or -name "*.ext2" \) 
0

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

0
Kamil Maciorowski
{ find . -type f -name "*.ext1" -printf "%h\n" | sort -u; find . -type f -name "*.ext2" -printf "%h\n" | sort -u; } | sort | uniq -d 

Объяснение:

  • find ... -printf "%h\n" печатает каталоги, содержащие файлы, которые совпадают;
  • sort -u удаляет дубликаты;
  • есть find ... | sort -uтруба для каждого из двух расширений;
  • финал sort | uniq -dпечатает строки, которые появляются более одного раза; путь к каталогу будет появляться более одного раза, если он будет возвращен каждым find ... | sort -u.

Есть как минимум две проблемы:

  1. -printfэто не POSIX. Переносимый вариант команды может быть:

    { find . -type f -name "*.ext1" | xargs -L 1 dirname | sort -u; find . -type f -name "*.ext2" | xargs -L 1 dirname | sort -u; } | sort | uniq -d 

    xargsбудет жаловаться, если findничего не найдет; это не должно нарушать логику, хотя.

  2. Новые строки в именах каталогов нарушают логику. Они могут генерировать ложные срабатывания, сделать вывод неоднозначным. Инструменты, расширенные за пределы своего минимума POSIX, могут поддерживать опции, которые позволяют вам анализировать строки с нулевым символом в конце. Это работает в моем Debian:

    { find . -type f -name "*.ext1" -printf "%h\0" | sort -u; find . -type f -name "*.ext2" -printf "%h\0" | sort -z -u; } | sort -z | uniq -z -d 

    Чтобы получить более удобный для восприятия формат, отправьте его по адресу tr '\0' '\n'. Новые строки из имен каталогов по-прежнему будут вызывать неоднозначность, но по крайней мере несколько строк из одного имени каталога будут появляться последовательно, как вы, безусловно, этого хотите.

Потрясающий ответ! Это больше, чем я ожидал. Огромное спасибо. Dulanic 5 лет назад 0

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