Listar files que no tienen otro file con sufijo

Considere un directory con los siguientes files:

file1 file1.suffix file2 file3 file3.suffix 

Necesito enumerar todos los files de manera que no exista otro file que tenga el mismo nombre y un sufijo conocido. En el ejemplo anterior que coincidiría solo con el file2 .

Esto es lo que se me ocurrió:

 diff --new-line-format= --unchanged-line-format= \ <(ls -I '*.suffix' | sort) \ <(ls *.suffix | sed 's/\(.*\)\.suffix/\1/' | sort) 

¿Hay una manera más simple y más corta?

Editar 1

En mi caso concreto, en realidad hay varios sufijos (files de zona de enlace / w dnssec):

 example.org example.org.jbk example.org.jnl example.org.signed example.org.signed.jnl example.com 

Estoy intentando enumerar las zonas que no tienen activado dnssec, es decir, los files que no tienen otro file con extensión .signed .

Este es mi bash:

 diff --new-line-format= --unchanged-line-format= \ <(ls -I '*.jbk' -I '*.jnl' -I '*.signed' -I '*.signed.jnl' | sort) \ <(ls *.signed | sed 's/\(.*\)\.signed/\1/' | sort) 

Con zsh :

 setopt extendedglob # for the first "^" below ls -ld -- ^*.suffix(^e:'[[ -e $REPLY.suffix ]]':) 

(o use ^*.* lugar de ^*.suffix si solo desea considerar los files sin extensión, o, luego de la actualización de su pregunta *.(org|net|com) o ^*.*.* o ^*.(signed|jnl|jbk) …)

Eso es una list de los files que no son .suffix , para los cuales el file .suffix no existe usando el calificador e glob para seleccionar files basados ​​en la valoración de algún código (donde $REPLY contiene la ruta del file para seleccionar).

Otro enfoque que usa el operador de disyunción array ${a:|b} (mnemotécnica: elementos de a barra los de b ):

 bare=(^*.suffix(N)) with_suffix=(*.suffix(N:r)) ls -ld -- ${bare:|with_suffix} 

ls -ld -- solo se usa aquí como un command de ejemplo, puede usar cualquier otro command o almacenar la list en una matriz como:

 without_suffix=(${bare:|with_suffix}) 

Como su list de files actual tiene una convención de nomenclatura simple, aquí hay un breve enfoque ls + cut + uniq :

 ls -v1 * | cut -d'.' -f1 | uniq -u 

No sé si es más corto, pero bastante sencillo en el caparazón (Bash y zsh lo probaron rápidamente):

 for f in * ; do [[ $f != *.suffix ]] && ! [[ -f "$f.suffix" ]] && echo "$f" done 

(o reemplace el echo con algo sensato)

O lo mismo con múltiples sufijos:

 suffixes=(suffix postfix) for f in * ; do for s in "${suffixes[@]}" ; do [[ $f == *".$s" ]] || [[ -f "$f.$s" ]] && continue 2 done echo "$f" done