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

Я запускаю тесты набора тестов с переменным размером и содержанием. Файлы данных добавляются и удаляются часто. Я ищу автоматизированный способ сбора списка файлов.

Все файлы находятся в подкаталогах D ; Мне нужен полный каталог и имя, добавленное в текстовый файл. Однако мне нужны только те файлы, которые имеют «парный» файл с тем же именем файла, но с другим расширением (поэтому … другое имя файла, но структурированным образом). Итак, если есть MyFileName.A и MyFileName.B , то я хочу, чтобы D/.../MyFileName добавлен в список файлов.

Есть файлы .A без файлов .B , но нет файлов .B без файлов .A . Если .A имеет файл .B , то оба файла находятся в одном каталоге.

Любой совет?

Если ни одно из имен файлов не содержит никаких новых строк, вы можете сделать:

 find D -type f \( -name '*.A' -o -name '*.B' \) | sed 's/\.[^.]*$//' | sort | uniq -d >paired_files 

Это должно работать в более общем случае, когда есть файлы .B без файлов .A .

Чтобы обработать любое имя файла, используя последние инструменты GNU:

 find D -type f \( -name '*.A' -o -name '*.B' \) -print0 | sed -z 's/\.[^.]*$//' | sort -z | uniq -dz | tr '\0' '\n' >paired_files 

Если вы утверждаете, что «нет файлов .B без файлов .A», то получите список файлов .B и удалите расширение.

 find $directory-to-search -name "*.B" | sed -r -e "s~(.*)\.B~\1~g" 

С zsh :

 print -rl mydir/**/*.A(.e_'REPLY=$REPLY:r; [[ -f $REPLY.B ]]'_) 

:r удаляет расширение, поэтому если содержимое $REPLY было mydir/somedir/somefile.A после запуска REPLY=$REPLY:r его содержимое становится mydir/somedir/somefile ;
остальное похоже на этот ответ .