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

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

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

1 ответ1

0
{ 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 труба -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' . Новые строки из имен каталогов по-прежнему будут вызывать неоднозначность, но по крайней мере несколько строк из одного имени каталога будут появляться последовательно, как вы, безусловно, этого хотите.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .