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

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

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

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

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

Любой совет?

решение1

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

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

решение2

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

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

решение3

С zsh:

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

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

Связанный контент