Modèle de correspondance de fichier en ligne de commande?

0

Quelqu'un peut-il m'aider avec un modèle de correspondance de fichier en ligne de commande relativement complexe?

J'ai des fichiers dans un répertoire comme suit:

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

Je veux lister tous les fichiers qui n'ont pas de copie avec le même nom de fichier avec -1quelque part dedans. Ainsi, dans l'exemple ci-dessus, les résultats seraient 3.png.

NB: le fichier et sa copie avec "-1" seront de la même taille, si cela peut vous aider.

Quelqu'un peut-il suggérer comment faire cela?

Richard
la source

Réponses:

2

En supposant que tous les fichiers avec -nsont une copie et que vous ne voulez pas les pouces non plus, cela fonctionne dans KornShell (ksh), ainsi que dans Bash avec l' extgloboption set ( shopt -s extglob):

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

Si seul "-1" détermine qu'il s'agit d'une copie, vous ne disposez pas non plus de copie de vos fichiers 2-1.png ou 2-1_thumb.png. Si ce sont vos critères de correspondance et que vous souhaitez que les pouces soient également testés, vous pouvez le faire.

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

Sinon, si les pouces ne comptent pas, la réponse de KAK devrait convenir

Old Wolf
la source