Puncte:0

Copiați totul dintr-un folder în directorul rădăcină al proiectului

drapel in

Am un proiect web cu următoarea structură:

cerere/
haldele/
nginx/
busteni/
.git/
docker-compose.yml
Dockerfile
README.md
.gitignore

Din mai multe motive, aș dori să dizolv folderul aplicației și să copiez toate fișierele în directorul rădăcină. Aș dori să fac asta ca de obicei prin intermediul CLI. Totuși, momentan nu ajung nicăieri.

Am încercat următoarele. Sunt la rădăcina proiectului.

aplicație cp -r/ ./
// output cp: „application/” și „./application” sunt același fișier

aplicația cp -r/*.* ./
// copiați numai fișierele rădăcină din aplicație în rădăcina proiectului și nu folderele.

Ceea ce este logic. Cum formulez comanda astfel încât să copieze numai fișierele în rădăcină? Probabil că este doar un lucru mic, dar este prea devreme pentru mine.

Maik Lowrey avatar
drapel in
@NateT Aș elimina aplicația, dar o voi copia înainte de a elimina tot conținutul la rădăcină. Da.
terdon avatar
drapel cn
Amintiți-vă că majoritatea fișierelor nu au extensii pe sistemele Linux, așa că `*.*` nu este aproape niciodată ceea ce doriți, deoarece se va potrivi doar cu fișierele sau directoarele care au un `.` în numele lor. Pentru a se potrivi cu totul, vrei doar `*`.
Puncte:0
drapel in

Bine. Am înțeles. Era prea devreme ;-) Comanda corectă ar fi:

cp -a app/. ./

Și mai bine să folosiți opțiunea -a în loc de opțiunea -r. Este o opțiune și un mijloc recursiv îmbunătățit, care păstrează toate atributele fișierului și, de asemenea, păstrează legăturile simbolice. L-am gasit: Cum pot copia conținutul unui folder într-un alt folder dintr-un alt director folosind terminalul?

. la sfârșitul căii sursă este o sintaxă specifică cp care permite copiați toate fișierele și folderele, inclusiv cele ascunse.

bac0n avatar
drapel cn
cred că ai vrut să faci `cp -T app/ .` (probabil este înțelept să adaugi `-i`)
Maik Lowrey avatar
drapel in
@bac0n Mulțumesc pentru comentariu. De ce sfătuiți să adăugați opțiunea „i”? si ce inseamna -T? L-am copiat ca în răspunsul meu și a funcționat bine „până acum”. ar trebui să fiu îngrijorat acum?
Maik Lowrey avatar
drapel in
@bac0n înseamnă interactiv. da ar fi bine. Mulțumiri. dar nu am găsit o explicație pentru opțiunea -T.
bac0n avatar
drapel cn
Ținta nu trebuie să existe înainte de a copia este probabil diferența principală, în continuare, dacă *sursa* este un fișier și țintiți un director, obțineți o eroare în loc ca fișierul să fie copiat în director (ar trebui să fie cp -aT sau -rT pentru recursiv).
Nate T avatar
drapel it
@Maik Este Bash, există 10 moduri separate de a face orice. Lucram la un scenariu, da. care folosește atât `cp -a`, cât și o redirecționare de la find în aproximativ 10-15 linii unul de celălalt. Aș recomanda să căutați mai departe în toate versiunile și să învățați particularitățile și avertismentele fiecăreia. De exemplu, un set de comenzi poate fi exact la fel cu parametrii, dar numai una citește din stdin cu niciunul. Acest lucru poate să nu conteze în 90% din timp, dar în a zecea oară, merită să cunoașteți diferența.M-am gândit că aș sublinia asta, deoarece este ceea ce țintesam inițial, dar cred că am ratat obiectivul înainte.
terdon avatar
drapel cn
Rețineți că acest lucru va copia și subdirectoarele, în timp ce întrebarea dvs. se adresează numai fișierelor. Nu sunt sigur dacă acest lucru este intenționat sau nu.
Maik Lowrey avatar
drapel in
@terdon fișiere și foldere. voi actualiza titlul de la întrebarea mea.
Puncte:-1
drapel it

Aveți nevoie doar de un wildcard la sfârșitul comenzii astfel:

aplicație cp -r/* ./
Maik Lowrey avatar
drapel in
Mulțumesc că ai răspuns. Dar nu merge. `cp: lipsește operandul fișierului destinație după 'sub/*'`
Maik Lowrey avatar
drapel in
Da și asta ar funcționa. Dar am folosit `cp -a app/. ./` înainte și funcționează perfect. Am fost neliniștit de comentariul lui bac0n. Se întâmplă să știi ce înseamnă opțiunea `-T`?
Nate T avatar
drapel it
Mă bucur că ai înțeles. @MaikLowrey
Maik Lowrey avatar
drapel in
Vă mulțumim pentru timpul și efortul acordat!
terdon avatar
drapel cn
@MaikLowrey răspunsul inițial avea ghilimele în jurul „aplicației/*”” care fac ca globul (caracterul metalic) să nu fie extins. Am remediat asta, dar a doua comandă este complet greșită, mă tem. Cred că ceea ce Nate a vrut să spună a fost ceva de genul `find ./application/ -type f -exec cp {} ./ +`.Comanda din acest răspuns va căuta în schimb _directories_ în directorul `/application/` și apoi va adăuga lista de nume de directoare la un fișier numit `/` care va eșua deoarece `/` este un director.
Maik Lowrey avatar
drapel in
Multumesc @terdon! Ai dreptate. Am luat `cp -a app/. ./` Cel mai bine este să folosiți comanda cu opțiunea -i (mulțumită lui bac0n) pentru a evita suprascrierea fișierelor cu același nume. În cazul meu, „doar” .gitigniore a fost suprascris. Comenzile cu recursivitate trebuie folosite cu atenție.

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.