Eu não consegui manter isso mais simples; isso funciona, mas assume que não há arquivos cujo nome de arquivo contenha novas linhas no diretório de destino ; primeiro teste o comando usando isto:
find . -type f \( -name "*.cut" -o -name "*.cut.bak" \) -exec bash -c '[ -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*//").rec" -o -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*//").mpg" ] && echo "{}"' \;
Se os arquivos listados são aqueles que devem ser excluídos, você pode prosseguir e executar isso:
find . -type f \( -name "*.cut" -o -name "*.cut.bak" \) -exec bash -c '[ -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*//").rec" -o -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*//").mpg" ] && rm "{}"' \;
Teste em uma hierarquia de diretórios criada ad hoc:
~/tmp$ tree
.
└── dir1
├── file1.cut
├── file1.cut.bak
├── file1.rec
├── file2.cut
├── file2.cut.bak
├── file2.mpg
├── file3.cut
├── file3.cut.bak
└── subdir1
├── file1.cut
├── file1.cut.bak
├── file1.rec
├── file2.cut
├── file2.cut.bak
├── file2.mpg
├── file3.cut
└── file3.cut.bak
2 directories, 16 files
~/tmp$ find . -type f \( -name "*.cut" -o -name "*.cut.bak" \) -exec bash -c 'if [ -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*//").rec" -o -f "$(<<< "{}" sed "s/\(.*\/[^.]*\).*//").mpg" ]; then rm "{}"; fi' \;
~/tmp$ tree
.
└── dir1
├── file1.rec
├── file2.mpg
├── file3.cut
├── file3.cut.bak
└── subdir1
├── file1.rec
├── file2.mpg
├── file3.cut
└── file3.cut.bak
2 directories, 8 files
Como você pode ver, todos os arquivos com extensão .cut
ou .bak
para o qual existe um arquivo com o mesmo nome e extensão .rec
ou .mpg
são excluídos recursivamente ( file1.cut
e file1.cut.bak
são excluídos por causa de file1.rec
, file2.cut
e file2.cut.bak
são excluídos porque file2.mpg
; file3.cut
e file3.cut.bak
não são excluídos porque não há file3.rec
ou file3.mpg
no mesmo diretório)