Puncte:-2

Cum să redenumiți fișierele în ubuntu, recursiv, folosind grep și rename not find?

drapel cn

Există milioane de întrebări și răspunsuri cu privire la redenumirea fișierelor. Sunt nou în Linux și această multitudine de moduri posibile și rezultate diferite și configurații diferite mă confundă.

De exemplu:

  • redenumiți funcționează, dar nu recursiv
  • grep funcționează recursiv, dar nu poate fi folosit pentru a căuta nume de fișiere și directoare, în loc de conținutul fișierului
  • găsi funcționează, dar are o sintaxă lungă urâtă atunci când doriți să căutați folosind expresii regulate.

Și, de asemenea, o mulțime de răspunsuri intreaba ubuntu și stackoverflow nu funcționează pentru mine și nu știu cum să le depanez și să le depanez.

Așa că, iartă-mă să mai întreb încă o dată.

Caut curatenie, memorabil mod de:

Redenumirea fișierelor recursiv folosind expresii regulate simple.

O fac deja pentru conținutul fișierelor folosind această sintaxă:

grep -rl search_regex | xargs sed -i 's/old/new/g'

Funcționează fără multă frustrare. Funcționează din cutie. Pur și simplu funcționează. Caut o soluție viabilă, îngrijită și curată. Ma poti ajuta te rog?

muru avatar
drapel us
„Curat”, „de memorat”, „urât” totul în ochiul privitorului. La această întrebare nu se poate răspunde obiectiv și ar trebui închisă ca bazată pe opinie
Saeed Neamati avatar
drapel cn
@muru, deja s-a răspuns.
muru avatar
drapel us
Pot să văd asta și, judecând calitatea răspunsului acceptat, ceea ce am spus rămâne adevărat.
lys avatar
drapel nl
lys
Căutarea Google m-a condus aici. Răspunsul de mai jos folosind `globstar` m-a ajutat să rezolv aceeași problemă.
Puncte:4
drapel in

Nu pot găsi nimic lung și urât despre găsi:

găsi . -regex „search_regex” -exec redenumește „s/old/new/g” {} +
Saeed Neamati avatar
drapel cn
Dacă vezi răspunsul lui @wizardpurple, îți dai seama că această sintaxă este urâtă. De ce ar trebui să specific comutatorul `-regex`? De asemenea, de ce `-exec` când pot folosi o conductă simplă? De asemenea, ce este acel `+` de la sfârșit? De asemenea, cu `grep` pot omite acele ghilimele simple din jurul regex-ului meu. `găsește. | căutare grep | redenumiți 's/old/new/g'`.
pLumo avatar
drapel in
Argumentele tale sunt greșite. De ce este pipe mai bună decât `-exec`? Pipe introduce probleme (vezi comentariul meu la răspunsul lui @wizardpurple). Btw: Nu puteți omite ghilimele în jurul expresiei regex, acest lucru este pur și simplu greșit.
pLumo avatar
drapel in
Dacă urât/complicat înseamnă *„Nu cunosc sintaxa”*, s-ar putea să ai dreptate. Cred că pipe și `grep` sunt mai complicate, mai ales când îți pasă de problemele care vin cu ele (de care nu țin răspunsul lui).
Saeed Neamati avatar
drapel cn
urat si complicat inseamna ca dupa ce am citit aproape 20 de intrebari, nu mi-am putut rezolva problema. Curat înseamnă că, după ce citești un răspuns simplu, problema mea este rezolvată. Nu vorbesc despre înțelegerea mea ca fiind criteriul simplității. Vorbesc despre productivitate ca criteriu aici.
pLumo avatar
drapel in
și cum această comandă `find` nu este suficientă pentru nevoile dvs. pentru "*problema mea este rezolvată*"? Acesta este mai curat, mai rapid și are mai puține probleme.
Saeed Neamati avatar
drapel cn
V-am spus problemele în comentariul anterior. Universalitatea contează. Când folosesc `grep`, nu trebuie să-l împachetez între ghilimele simple. Am de-a face cu **ONE** sintaxă universală. De asemenea, știu că lucrez mereu cu expresii regulate.De asemenea, tubulatura este cel mai simplu mod de a combina lucrurile. Conducta este mult mai ușoară decât cunoașterea întrerupătoarelor. Acestea sunt motivele mele pentru productivitate.
pLumo avatar
drapel in
Să [continuăm această discuție în chat](https://chat.stackexchange.com/rooms/126448/discussion-between-plumo-and-saeed-neamati).
vanadium avatar
drapel cn
Adăugați ghilimele astfel încât să gestioneze spațiile corect (`"{}"`). Dacă numărul de fișiere este foarte lung, atunci argumentul poate deveni prea lung. Folosind `\;` la sfârșit în loc de `+` va împiedica acest lucru, dar va deveni mai lent: comanda `rename` este apoi executată de fiecare dată din nou pentru fiecare fișier individual. Cu toate acestea, puteți gestiona un număr nelimitat de fișiere.
pLumo avatar
drapel in
@vanadium --> `find` îi pasă de spații fără ghilimele în jurul lui `{}`. Același lucru pentru argumentele maxime `find -exec ... +` va avea grijă și va trimite doar cât mai multe argumente posibil.
vanadium avatar
drapel cn
@pLumo, deci este destul de inteligent! Bine de stiut!
Puncte:2
drapel cn

Puteți face redenumiți recursiv dacă aceasta este sintaxa pe care o preferați:

shopt -s globstar
redenumiți „s/old/new/” **/*

lui Bash globstar opțiunea face ** potrivește 0 sau mai multe directoare sau fișiere recursiv, deci **/* va recurge în josul întregului arbore de directoare. Trebuie doar să scrieți modelul de căutare ca un glob în loc de o expresie obișnuită. De exemplu, pentru a redenumi toate fișierele al căror nume conține foo, ai face:

shopt -s globstar
redenumiți „s/old/new/” **/*foo*
Puncte:0
drapel cn

Ar trebui să puteți păstra mai mult sau mai puțin același format pe care l-ați avut cu grep și sed, deși cred că veți avea nevoie de un instrument precum find pentru a furniza grep fișiere prin care să căutați.

Editare: actualizat cu informații din comentarii. mulțumesc @pLumo și @terdon pentru că au arătat că ar eșua pentru fișierele cu caractere newline în nume.

găsiți /unele/director -print0 | grep -zE "search_regex" | redenumiți -0 's/old/new/g'
pLumo avatar
drapel in
Ar trebui să utilizați null ca delimitator, deoarece linia nouă este un caracter valid pentru un nume de fișier. Utilizați: `find -print0`, `grep -z` și `rename -0`.
Saeed Neamati avatar
drapel cn
Acum, acest lucru este curat și memorabil. L-am testat și pur și simplu a funcționat. Nu este nevoie să schimbi nimic. Mulțumesc mult. `găsește . | căutare grep | redenumiți 's/old/new/g'`
terdon avatar
drapel cn
Acest lucru va eșua pentru numele fișierelor care conțin linii noi @SaeedNeamati și wizardpurple.

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.