Je vois une méthode "bourrin" qui devrait fonctionner, par contre ça coutera surement 1 a 2 sec de temps CPU :s
En gros l'idée serait de générer 2 fichiers :
- l'un qui contient la liste de tes fichiers nommé en hexa (FILE1)
- l'autre qui contient la liste des nombres en hexa compris entre 0 et FFFF (si possible créé à l'avance pour éviter de la regénérer à chaque fois) (FILE2)
Ensuite tu peux utiliser la commande "comm" pour sortir ce qui est présent dans "FILE2" et absent de "FILE1"
La commande "comm" est très rapide, mais implique que les fichiers soit trié de la même façon via un sort
Pour générer le fichier "FILE2" une boucle sur un printf devrait faire l'affaire (peut être qu'il y a mieux, je ne sais pas) :
Code :
- for i in {0..65535}
- do
- printf '%.4X\n' $i
- done > FILE2
|
et le comparatif
Code :
- comm -13 FILE1 FILE2
|
Edit : même pas besoin de rediriger le ls vers un fichier en fait :
Code :
- ls | sort | comm -13 - FILE2
|
Je viens de tester avec un jeu réduit et ça fonctionne nickel. Je pense même que si tu as les 65000 fichiers ça devrait être invisible niveau CPU si FILE2 est généré une fois au préalable
Edit2 : Vu que ça m'amusais ce truc, j'ai généré un répertoire avec les 65536 fichiers, j'en ai supprimé 2 et lancé le script en générant à la volée le fichier FILE2. Résultat du time, sur un poste linux de bureau, pas du tout un serveur :
Citation :
30C7 7AAA real 0m0.94s user 0m0.74s sys 0m0.37s
|
Et le script utilisé :
Code :
- for i in {0..65535}
- do
- printf '%.4X\n' $i
- done > FILE2
- cd test
- ls | comm -13 - ../FILE2
|
Message édité par Nukolau le 08-12-2014 à 17:47:44