przekazując wyjście grep do rm

47

Próbuję grepprzesyłać dane wyjściowe do potoku rm, ale generuje to bezużyteczne rzeczy. Czy wymagany jest jakikolwiek przełącznik rm? Czy może rmbyć bezpośrednio wyrażeniem regularnym?

ls | grep '^\[Daruchini'| rm

rm: brakujący operand Aby uzyskać więcej informacji, wypróbuj `rm --help '.

CodeBladeRunner
źródło
Zawsze kopiuj i wklej komunikaty o błędach. (Wstawiłem rzeczywisty komunikat o błędzie z korzyścią dla przyszłych czytelników. Ale mogłem to zrobić, ponieważ w tym przypadku jest tylko jeden możliwy komunikat o błędzie. W większości przypadków konieczne jest podanie dokładnego komunikatu o błędzie, aby zrozumieć problem Tak więc zawsze kopiuj i wklej wszystkie komunikaty o błędach w całości.)
Gilles „SO- przestań być zły”

Odpowiedzi:

57

Musisz użyć, xargsaby zamienić standardowe dane wejściowe na argumenty rm.

$ ls | grep '^Dar' | xargs rm

(Uważaj na znaki specjalne w nazwach plików; w GNU grep możesz preferować

$ ls | grep -Z '^Dar' | xargs -0 rm

)

Ponadto, chociaż powłoka nie używa wyrażeń regularnych, jest to prosty wzorzec:

$ rm Dar*

(tymczasem myślę, że potrzebuję więcej snu.)

geekozaur
źródło
2
Zakładając, że pytający nie popełnił błędu, gdy opublikował (a) pytanie, on (a) go szuka rm Dar*, nie rm !(Dar*).
Gilles „SO- przestań być zły”
... tak, tak, utknąłem w zsh ^trybie (podobnie do basg !rzeczy).
geekozaur
1
+1 Świetna odpowiedź, musiałem dodać | tr "\n" "\0"przed xargsbit. Widziane w tym poście: stackoverflow.com/questions/20307299/…
Adam Plocher
5

Nie analizuj danych wyjściowychls .

Tutaj bardzo łatwo jest uzyskać powłokę do filtrowania żądanych plików. Zauważ, że to powłoka rozwija wzór Dar*, a nie rmpolecenie. Rozwinięcie wzorca wykonywane przez powłokę nazywa się globowaniem .

rm Dar*

W bardziej skomplikowanych przypadkach wyszukaj findpolecenie.

Gilles „SO- przestań być zły”
źródło
3

Jeśli chcesz ograniczyć dane wyjściowe grepznakami nowej linii zamiast białych znaków, możesz to określić xargsza pomocą -dopcji.

$ ls | grep '^Dar' | xargs -d '\n' rm

(jak opisano w tym pytaniu)

mherzl
źródło
2

Do przekazywania danych wyjściowych jako argumentu zwykle używam pętli while, ponieważ nie znam xargs.

ls | grep '^Dar' | while read line; do rm "$line";done;
Mitmy
źródło
to jedyny, który działał w moim przypadku.
marbel
0

Najlepszym dla mnie poleceniem jest:

find ./Daruchini* -exec rm {}\;
Bodale
źródło