web-dev-qa-db-fra.com

Comment diriger ls vers grep et supprimer les fichiers filtrés par grep?

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.

34
SpecialBomb

Cela m'a presque fait grimacer.

  1. Vous voudrez peut-être arrêter de pointer cela fusil de chasse à votre pied. Fondamentalement, tout type d'analyse de ls va être plus compliqué et sujet aux erreurs que les méthodes établies comme find [...] -exec ou globes .
  2. À moins que quelqu'un n'ait installé une distribution de troll pour vous, votre Shell a Tab achèvement. Tapez simplement 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.
  3. Pipes ! = paramètres . L'entrée standard est un flux de données binaires qui peut être envoyé à une commande de manière asynchrone. Les paramètres sont des chaînes séparées par des espaces qui sont transmises une et une seule fois à une commande lors de son exécution. Celles-ci sont très rarement interchangeables.
57
l0b0

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.

35
John

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.

34
chander

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.

12
Hastur
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.

5
mikeserv

rm n'accepte pas les entrées de stdin. Vous devrez faire quelque chose comme ls google-chrome* | xargs rm

2
David King