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ăsi
introduceț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)?