Я запускаю тесты тестового набора переменного размера и содержимого. Файлы данных часто добавляются и удаляются. Я ищу автоматизированный способ сбора списка файлов.
Все файлы находятся в подкаталогах 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
;
остальное аналогичноэтот ответ.