¿Patrón de coincidencia de archivos en la línea de comando?

¿Patrón de coincidencia de archivos en la línea de comando?

¿Alguien puede ayudarme con un patrón de coincidencia de archivos de línea de comandos relativamente complejo?

Tengo archivos en un directorio de la siguiente manera:

1.png
1_thumb.png
1-1.png
1-1_thumb.png
1-2.png
1-2_thumb.png
2.png 
2_thumb.png
2-1.png
2-1_thumb.png
3.png
3_thumb.png
3-1_thumb.png

Quiero enumerar todos los archivos que no tienen una copia con el mismo nombre de archivo en -1algún lugar. Entonces, en el ejemplo anterior, los resultados serían 3.png.

NB: el archivo y su copia con "-1" tendrán el mismo tamaño de archivo, si eso ayuda.

¿Alguien puede sugerir cómo hacer esto?

Respuesta1

Suponiendo que todos los archivos -nson una copia y que tampoco desea los pulgares, esto funciona en KornShell (ksh) y también en Bash con la extglobopción establecida ( shopt -s extglob):

for f in !(*_thumb.png|*-[1-9].png); do
  g=${f%.png}-1.png
  test -f $g || echo $f
done

Respuesta2

Si solo es "-1" lo que determina que es una copia, entonces tampoco tienes ninguna copia de tus archivos 2-1.png o 2-1_thumb.png. Si ese es su criterio de coincidencia y desea que también se prueben los pulgares, puede hacerlo

for i in `ls |grep -v "\-1"  | cut -f1 -d.`; do 
    if `echo $i | grep thumb > /dev/null`; then 
        test -f `echo $i.png | sed 's/_/-1_/g'` || echo $i.png; 
    else 
        test -f $i-1.png || echo $i.png; 
    fi; 
done

De lo contrario, si los pulgares no cuentan, la respuesta de KAK debería ser adecuada.

información relacionada