Je voulais supprimer un paquet dans mon fichier d'accueil, mais le nom de fichier était trop long (google-chrome-stable_current_i386.deb
). J'ai donc décidé d'utiliser la commande ls|grep chrome|rm
pour diriger les fichiers vers grep pour filtrer le fichier chrome, puis le supprimer. Cela n'a pas fonctionné, je voudrais donc voir comment je peux le faire.
Cela m'a presque fait grimacer.
ls
va être plus compliqué et sujet aux erreurs que les méthodes établies comme find [...] -exec
ou globes .rm google
et appuyez sur Tab. S'il ne se termine pas immédiatement, appuyez sur Tab à nouveau pour voir une liste des fichiers correspondants. Tapez plus de caractères du nom de fichier pour le réduire jusqu'à ce qu'il se termine, puis exécutez la commande.Vous avez eu la bonne idée, juste raté quelques détails. Puisque vous avez affaire à une liste venant de STDIN et que rm
attend des paramètres, vous devez utiliser xargs
.
Donc:
ls | grep chrome | xargs rm
Devrait vous donner ce que vous voulez.
Notez que si vous souhaitez supprimer tout autre que le fichier chrome
, vous pouvez simplement ajouter -v
à l'instruction grep
.
Notez que, selon les autres réponses à cette question, c'est probablement une mauvaise façon d'accomplir ce que vous voulez accomplir.
Vous pouvez également utiliser la commande find avec un caractère générique:
find . -maxdepth 1 -name '*chrome*' -delete
Notez que l'argument "-maxdepth" garantit que la recherche ne fonctionne que dans le répertoire en cours et ne récursive pas dans les sous-répertoires.
Ne jamais analyser la sortie de ls
Ma suggestion est d'éviter d'analyser la sortie de ls [ 1 ], encore plus s'il est associé à la commande del
. Ceci pour de nombreuses raisons principalement liées aux caractères inattendus et inhabituels autorisés dans le nom de fichier.
Même lorsque vous devez vous attendre à ce que les noms de fichiers appartenant aux packages Linux "se comportent bien", ce problème peut néanmoins apparaître si d'autres fichiers sont présents dans le même répertoire mais que vous ne saviez pas ou ne remarquiez pas.
Il est préférable d'utiliser find
, l'expansion de l'onglet (commencez à écrire le nom et appuyez sur Tab), l'extension extension du nom de fichier [ 2 ] comme *MyKey*
...
Une solution rapide
Puisque vous souhaitez sélectionner tous les packages (qui se terminent par .deb
) Avec "google" à l'intérieur, vous pouvez créer votre demande avec le caractère générique *
*google*.deb
Et faites un simple
rm -i *google*.deb
qui sélectionnera chacun nom de fichier avec "google" au milieu qui se terminera pour .deb
présent dans le répertoire courant. L'option -i
(Interactive) demandera la confirmation, une bonne habitude lorsque vous supprimez des fichiers avec l'extension de paramètre.
Une solution proche de la philosophie de votre tentative
Si votre but est de construire votre ligne de commande morceau par morceau, vous avez donc fait ls
, après ls | grep google
, Et seulement après avoir vérifié votre sortie vous pouvez l'exécuter dans un sous-shell $(...)
avec
rm -i $(ls | grep google)
Un moyen plus rapide et plus dangereux [], consiste à utiliser !!
ls | grep google
rm -i $(!!)
qui exécutera la dernière commande terminée dans votre historique . Vous pouvez vous protéger du fait que vous n'avez aucun contrôle visuel de la ligne que vous allez exécuter si vous avez activé à l'avance les options Shell histverify
avec shopt -s histverify
.
touch 0 1 2 3 4 5 6 7 8 9
find . -name \[0-9] -ok rm {} \;
< rm ... ./0 > ? y
< rm ... ./9 > ? y
< rm ... ./8 > ? y
< rm ... ./7 > ? y
< rm ... ./6 > ? y
< rm ... ./5 > ? y
< rm ... ./4 > ? y
< rm ... ./3 > ? y
< rm ... ./2 > ? y
< rm ... ./1 > ? y
^C
...utilisation -name '*c*.deb'
ou un autre motif qui vous convient à la place.
rm
n'accepte pas les entrées de stdin
. Vous devrez faire quelque chose comme ls google-chrome* | xargs rm