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é, donc j'aimerais voir comment je peux y arriver.
33
rm -i *chrome*.deb
ls
find
-find . -name "*chrome*" -delete
.ls
passant , que vous avez essayé de passergrep
à travers,rm
mais que vous ne pouvez pas le faire fonctionner. De cette façon, vous obtiendrez une ou deux bonnes réponses sur la façon "correcte" ou "la plus simple" d'accomplir votre tâche plutôt que de forcer quelqu'un à vous donner une bonne réponse sur une solution inefficace.Réponses:
Cela m'a presque fait grimacer.
ls
va être plus compliqué et sujet aux erreurs que les méthodes établies commefind [...] -exec
ou globs .rm google
et appuyez sur Tab. S'il ne se termine pas immédiatement, appuyez à Tabnouveau 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.la source
rm
- c'est probablement la façon la plus courante de faire frire votre distribution.Vous pouvez également utiliser la commande find avec un caractère générique:
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.
la source
-iname
pour les noms de fichiers insensibles à la casse (b) rediriger vers l'xargs
utilisation de-print0
flag forfind
et-0
flag forxargs
. L'utilisation dexargs
vous permet d'effectuer des opérations telles que les suppressions "interactives" (confirmer la suppressionfoo
?).find . -name '*chrome*' -exec rm -i {} +
maxdepth
1.Vous avez eu la bonne idée, juste raté quelques détails. Puisque vous avez affaire à une liste venant sur STDIN et
rm
attend des paramètres, vous devez utiliserxargs
.Ainsi:
Devrait vous donner ce que vous voulez.
Notez que si vous souhaitez supprimer tout autre que le
chrome
fichier, vous pouvez simplement ajouter-v
à l'grep
instruction.Notez que, selon les autres réponses à cette question, c'est probablement une mauvaise façon d'accomplir ce que vous voulez accomplir.
la source
-v
, cela ne supprimerait-il pas tout sauf les fichiers qui correspondentchrome
? Je ne pense pas que c'est ce que le PO veut ...ls
sortie. Les noms de fichiers avec des espaces vont détruire cela. Cela est également dangereux si quelqu'un peut construire un nom de fichier avec une sauce spéciale dans le répertoire où vous l'exécutez. Comme plusieurs personnes l'ont déjà souligné, n'analysez pas la sortie de ls !Ne jamais analyser la sortie de ls
Ma suggestion est d' éviter d'analyser la sortie de ls [ 1 ] , encore plus si elle est associée à la
del
commande. 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 vous attendez à 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' expansion du nom de fichier [ 2 ] comme*MyKey*
...Une solution rapide
Puisque vous voulez 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 faire un simplequi sélectionnera chaque nom de fichier avec "google" au milieu qui se terminera pour être
.deb
présent dans le répertoire courant. L'option-i
(interactive) vous 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 pièce après pièce, donc vous l'avez fait
ls
, aprèsls | grep google
, et seulement après avoir vérifié votre sortie, vous pouvez l'exécuter en sous-shell$(...)
avecUn moyen plus rapide et plus dangereux [ 3 ] , consiste à utiliser
!!
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 du shell
histverify
avecshopt -s histverify
.la source
... utilisez
-name '*c*.deb'
plutôt un autre modèle qui vous convient.la source
rm
n'accepte pas les entrées destdin
. Vous devrez faire quelque chose commels google-chrome* | xargs rm
la source