Suppression de fichiers spécifiques en ligne de commande

8

J'ai des fichiers fileName_1 , fileName_2 ... fileName_100000 où les fileNames sont numérotés séquentiellement. Comment puis-je supprimer les fichiers d'index supérieurs à, disons 100 ?

teaLeef
la source

Réponses:

17

Si les noms de fichiers sont numérotés séquentiellement, exécutez simplement la commande suivante:

rm fileName_{100..100000}
cioby23
la source
3
Info: Cela fonctionne car bash (votre shell) étendra le {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'imprime test1 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'imprimer test 1 2 3.
Luc
1
Remarque: il y a une limite imposée par l' 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.
Bakuriu
Notez que ARG_MAX est un nombre d'octets, pas un nombre d'arguments. rm ne peut pas gérer la suppression de 2097152 fichiers à la fois. Il pouvait supprimer 2048 fichiers dont chacun avait un nom de 1023 octets (pas 1024; les délimiteurs entre les arguments (\ 0 en C-land) comptent pour la limite).
godlygeek
6

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.

Avinash Raj
la source
5

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.

Stefan Schmiedl
la source
4

Utilisez la commande suivante:

find . -name 'fileName_[100-100000]' -exec rm {} \;

Cela supprimera les fichiers de 100 à 100000.

Plus d'informations: Site

nux
la source
Il vaut mieux utiliser +plutôt que \;- voir ici . Ou, mieux encore, utilisez la -deletecommande find .
evilsoup
J'ai testé cela et il n'a supprimé que fileName_1. La [100-100000] classe de caractères ne correspond qu'à un seul caractère, elle ne peut donc correspondre qu'à 0 ou 1.
deltab