Réponses:
Si les noms de fichiers sont numérotés séquentiellement, exécutez simplement la commande suivante:
rm fileName_{100..100000}
execappel au nombre d'arguments qu'un processus peut avoir. Vous pouvez le récupérer avec getconf ARG_MAX. Par exemple, sur mon système, c'est 2097152(~ 2,1 millions). Cela signifie que rm(qui n'est pas intégré) échouera avec plus de ce nombre de fichiers. Les commandes intégrées n'ont pas ce problème, pas plus que les autres solutions proposées.
Vous pouvez également essayer cette commande,
for i in $(seq 100 100000); do rm fileName_$i; done
Il supprimera tous les fichiers (compris entre 100 et 100 000) si le nom de fichier contient des nombres dans un ordre séquentiel.
En général, vous disposez de plusieurs moyens pour y parvenir:
rm fileName_{100..100000}
sera étendu par le shell en environ 100 000 noms de fichiers. Si le nom de base est un chemin long et que le nombre est suffisamment élevé, vous pouvez en fait dépasser la longueur maximale d'une ligne de commande avec cette approche.
La forboucle
for i in $(seq 100 100000); do rm fileName_$i; done
ne souffre pas de ce problème, mais est un moyen relativement lent de supprimer les fichiers, car le shell doit effectuer la substitution de variables et lancer rm environ 100 000 fois.
Les deux méthodes ci-dessus peuvent provoquer des avertissements si certains fichiers, par exemple, filename_101étaient manquants.
Habituellement, les solutions basées sur findsont meilleures, car elles ne fonctionnent que sur les fichiers qui sont réellement là (pendant la découverte). Cependant, il existe quelques différences subtiles:
find . -name 'fileName_[100-100000]' -exec rm {} \;
lancera toujours le rmprogramme environ 100 000 fois, tout en remplaçant le dernier \;par +tentera de minimiser le nombre de sous-processus. Les deux méthodes seront probablement (beaucoup ou un peu) plus lentes que celles -deletequi n'utilisent pas du tout de commandes externes mais invoquent des appels système à la place.
Cependant, vérifiez toujours d' abord si le modèle correspond réellement aux fichiers que vous souhaitez cibler:
stefan@tuxedo ~ % mkdir askubuntu
stefan@tuxedo ~ % touch askubuntu/filename_{1..1000}
stefan@tuxedo ~ % find askubuntu -name 'filename_[100-1000]'
askubuntu/filename_1
Donc, dans ce cas, vous supprimez un fichier que vous souhaitez conserver et laissez les fichiers qui auraient dû être supprimés.
Utilisez la commande suivante:
find . -name 'fileName_[100-100000]' -exec rm {} \;
Cela supprimera les fichiers de 100 à 100000.
Plus d'informations: Site
[100-100000] classe de caractères ne correspond qu'à un seul caractère, elle ne peut donc correspondre qu'à 0 ou 1.
{x..y}à toute la liste. Par exemple, si vous l'utilisez,echo test{1..3}il sera développéecho test1 test2 test3puis exécuté. Comme vous pouvez le voir, il s'imprimetest1 test2 test3. De même, si le{x..y}n'est connecté à aucun argument, il y mettra simplement les chiffres. Par exemple,echo test {1..3}il suffit d'imprimertest 1 2 3.