Puncte:0

Trebuie să le „împachetăm” cu grep (cote mari) apoi rm toate potrivirile găsite într-o singură comandă... Este acest lucru realizabil?

drapel in

Problemă simplă, dar nu sunt suficient de suficient în conductele de comandă bash pentru a-mi realiza pe deplin aspirațiile. Speram să culeg, dacă nu comanda pe care o caut, atunci poate unde se află, aș putea să perfectionez literatura pentru a-mi îndeplini sarcina. Iată problema mea + ce am încercat până acum: Așa că am un hard disk la mâna a doua și există unele anomalii rămase în urmă cu numele lor ca nume de fișier care fac imposibil să realizez acest lucru, ca acum hard diskul meu. Am putut accesa punctul de montare rădăcină și am găsit fișierele pe care doresc să le elimin cu ''' ls -A | grep abcdef ''' există o modalitate de a trimite lista grep'd la o comandă '''rm -f''' după aceea, deoarece atunci când încerc '''ls -A | grep abcdef | rm''' nu prea a funcționat. După acel eșec enorm (ce spui mai exact?!) am încercat ''' ls -A | grep abcdef <| rm ''' plus multe alte iterații de stoc similar, dar fără niciun rezultat. Din nou, nu doresc neapărat „răspunsul ușor”, dar poate o locație exactă în care să pot obține o asistență limitată în redirecționarea ieșirii ar fi grozavă. (Mi-am răspuns singur? Ar face ce am nevoie să-l arunc pe /dev/null după aceea?...Voi încerca asta, dar asistență pentru redirecționarea comenzii nu ar strica să ceri, sperăm) Orice ajutor ar fi foarte apreciat, mulțumesc.

vanadium avatar
drapel cn
Încercați să fiți mai puțin pronunțat și mai la obiect. Indicați clar care este „sarcina” dvs., adică care este scopul vostru final. Luați în considerare utilizarea formatării codului pentru a distinge codul terminalului de text, ceea ce va ajuta, de asemenea, la îmbunătățirea lizibilității. Întrebările clare și lizibile au mai multe șanse să atragă răspunsuri clare și lizibile.
guiverc avatar
drapel cn
Aș scrie un `find` care găsește fișierele pe care le doriți, apoi adaug doar o opțiune `-delete` la acea comandă (adică lăsați-vă `find` rezolvat să șterge fișierele pe care le găsește); dar asta nu înseamnă folosirea conductelor așa cum o ceri.
drapel hr
Se pare că cauți `xargs`... totuși, așa cum a menționat @guiverc, `find` ar fi, în general, preferat față de `ls` + `grep` + (xargs) `rm`
Jake Baldwin avatar
drapel in
@vanadium - Am crezut că am făcut-o. Folosesc un dispozitiv mobil pentru a face această postare și în partea de jos a casetei de descriere a arătat cum să fac asta, așa că m-am gândit că pur și simplu nu a fost afișat în caseta mea de introducere. Am câteva rezultate din comanda grep'd „ls” pe care am vrut să le fi rm'd în loc să fie afișate într-o listă lungă.
Jake Baldwin avatar
drapel in
@guiverc - Le-aș „găsi” dar îmi doream toate fișierele cu numele anume oriunde în ele, așa că „ls -AR | grep abc” a fost cel mai bun la care puteam ajunge. Dacă există o modalitate mai bună cu „găsiți”, vă rog să-mi arătați. (Fără sarcasm)
Jake Baldwin avatar
drapel in
@steeldriver - O să mă uit la asta. xargs.... Va trebui să citesc pagina de manual de pe ea, mulțumesc tuturor.
guiverc avatar
drapel cn
`find` este o comandă care permite regex-uri ca cele pe care le utilizați (și mult mai complexe)... de exemplu. folosind clauza `-name`. Un lucru bun cu *unix* (posix, sau GNU/Linux) este că există multe moduri în care orice poate fi realizat. Asta a fost punctul @vanadium cred; spune-ne ce vrei să obții și s-ar putea să fi obținut multe rezultate care realizează ceea ce îți dorești (`find -name '*paper*'` va găsi numele fișierelor/directoarelor care conțin cuvântul hârtie (oriunde)... inclusiv căutarea în subdirectoarele de sub $PWD actual... adăugarea unui „-delete” la care ar duce la ștergerea acelor fișiere/folder
Puncte:2
drapel hr

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)?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.