Puncte:0

Înlocuirea eșuată a șirurilor în comanda xargs

drapel tr

Încerc să creez automat legături simbolice către directoare și să înlocuiesc un anumit șir de text (foo) al numelui original în numele linkului (bară). Numele directoarelor țintă poate conține spații (de exemplu, „foo with whitespace”).

Acesta este un exemplu minim:

> ls -Q

"foo"
"foo cu spatii albe"

Încerc următoarea comandă (folosind opțiunea xargs -p pentru a depana/verifica rezultatul înainte de execuție):

găsi . -iname „*foo*” -print0 | xargs -0 -I '{}' -p ln -s {} `echo {} | sed -e s#foo#bar#g

Rezultatul meu dorit este acesta:

ln -s „foo with whitespace” „bar with whitespace”
în -s „foo” „bar”

Cu toate acestea, înlocuirea șirului eșuează. Ieșirea reală arată astfel:

Ln -s './foo cu spatiu alb' './foo cu spatiu alb'?...
ln -s ./foo ./foo?...

Dacă folosesc șiruri constante în loc de {}, înlocuirea șirurilor funcționează conform intenției:

găsi . -iname „*foo*” -print0 | xargs -0 -I '{}' -p ln -s {} `echo "foo" | sed -e s#foo#bar#g`

Ln -s bara „./foo with whitespace”?...
Ln -s ./foo bar?...

Care este greșeala mea și cum repar invocarea comenzii?

Editați | ×: Soluția lui Tilman Schmidt funcționează ca un farmec.

Puncte:1
drapel bd

Înlocuirea comenzii

`echo {} | sed -e s#foo#bar#g`

se efectuează o singură dată, inainte de conducta compusă din găsi și xargs comenzile sunt executate. Asa de sed primește șirul {} ca intrare și, negăsind foo, îl scoate neschimbat. Atunci shell-ul rulează linia de comandă rezultată

găsi . -iname „*foo*” -print0 | xargs -0 -I '{}' -p ln -s {} {}

Deci înlocuirea comenzii este instrumentul greșit aici. Încearcă ceva de genul

găsi . -iname „*foo*” -print | în timp ce citește f; do ln -s "$f" "${f//foo/bar}"; Terminat

(netestat) în schimb. Rețineți că acest lucru nu va funcționa dacă aveți nume de fișiere care conțin linii noi.

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.