O țeavă (|) conectează fluxul de ieșire standard al unui proces la fluxul de intrare standard al altui proces. Nu puteți folosi asta pentru a transmite o listă de nume de fișiere rm direct, pentru că rm nu citește numele fișierelor din intrarea sa standard.
Tu ar putea folosește xargs program pentru a citi lista este intrare standard și „grupați” numele fișierelor pentru rm:
ls -A | grep abcdef | xargs rm
dar nu, există tot felul de probleme cu această abordare - în special că grep procesează intrarea linie cu linie, în timp ce xargs împarte intrările pe spații albe în mod implicit. Ai putea să-l faci mai bine folosind ceva de genul
shopt -s dotglob # simulate ls -A „aproape toate” fișierele ascunse
printf '%s\0' * | grep -z abcdef | xargs -0 rm
care folosește caracterul nul ASCII pentru a separa fără ambiguitate numele fișierelor. O abordare de obicei preferată este utilizarea găsi comanda:
găsi . -maxdepth 1 -name '*abcdef*' # -delete
(Am părăsit -șterge comentat pentru moment - asigurați-vă că este găsiintroduceți fișierele potrivite înainte de a le decomenta, deoarece nu există nicio operațiune de „anulare”).
Rețineți că găsi recurs în subdirectoare în mod implicit - dacă doriți echivalentul lui ls -R apoi scoateți -adancime maxima 1. Poti sa adaugi -tip f pentru a găsi și șterge numai fișiere (omițând directoare).
De asemenea, rețineți că găsi -nume folosește modele shell glob mai degrabă decât expresiile regulate utilizate de grep (are și un -regex predicat de potrivire, dar acest lucru nu pare să fie necesar aici).
Vezi si De ce nu analiza ls (și ce să faci în schimb)?