Tim cp: ispravno kopiranje mapa s datotekama u *nix

Tim cp: ispravno kopiranje mapa s datotekama u *nix

U ovom članku bit će razjašnjene neke nejasne stvari vezane uz korištenje wildcards prilikom kopiranja, dvosmislena ponašanja naredbe cp prilikom kopiranja, kao i načini koji omogućuju ispravno kopiranje velike količine datoteka bez propuštanja i grešaka.

Pretpostavimo da trebamo kopirati sve iz mape /source u mapu /target.

Prvo što nam pada na pamet je:

cp /source/* /target

Odmah ćemo ispraviti ovu naredbu na:

cp -a /source/* /target

Ključ -a dodaje kopiranje svih atributa, prava i dodaje rekurziju. Kada nije potrebno točno reproducirati prava, dovoljno je dodati ključ -r.

Nakon kopiranja otkrijemo da nisu sve datoteke kopirane — ignorirane su datoteke koje počinju s točkom, poput:

.profil
.lokalno
.mc

i sličnih.

Zašto se to dogodilo?

Zato što wildcards obrađuje shell (bash u tipičnom slučaju). Po zadanim postavkama bash ignoriše sve datoteke koje počinju s točkama, smatrajući ih skrivenima. Da bismo izbjegli ovo ponašanje, morat ćemo promijeniti ponašanje bash pomoću naredbe:

shopt -s dotglob

Da bi se ova promjena ponašanja sačuvala nakon ponovnog pokretanja, možemo napraviti datoteku wildcard.sh s ovom naredbom u mapi /etc/profile.d (moguće je da u vašoj distribuciji postoji druga mapa).

A ako u izvornoj mapi nema datoteka, shell neće moći ništa zamijeniti umjesto zvjezdice, i također će kopiranje završiti greškom. Protiv ovakve situacije postoje opcije failglob i nullglob. Trebat će nam opcija failglob, koja neće dopustiti da se naredba izvrši. nullglob neće odgovarati, jer će niz s wildcards bez podudaranja pretvoriti u prazni niz (nulte duljine), što će za cp uzrokovati grešku.

Međutim, ako u mapi ima tisuće datoteka i više, onda bi se trebalo potpuno odustati od pristupa s wildcards. Naime, bash razvlači wildcards u vrlo dugačku naredbenu liniju poput:

cp -a /souce/a /source/b /source/c …… /target

Za duljinu naredbene linije postoji ograničenje koje možemo saznati korištenjem naredbe:

getconf ARG_MAX

Dobit ćemo maksimalnu duljinu naredbene linije u bajtovima:

2097152

Ili:

xargs --show-limits

Dobit ćemo nešto poput:

….
Maksimalna duljina naredbe koju zapravo možemo koristiti: 2089314
….

Dakle, hajde da prođemo potpuno bez wildcards.

Jednostavno ćemo napisati

cp -a /source /target

I ovdje ćemo se suočiti s dvosmislenošću ponašanja cp. Ako mapa /target ne postoji, dobit ćemo ono što nam treba.

Međutim, ako direktorij target postoji, datoteke će biti kopirane u direktorij /target/source.

Ne možemo uvijek unaprijed obrisati direktorij /target, jer u njemu mogu biti potrebne datoteke i naš cilj, recimo, je dopuniti datoteke u /target datotekama iz /source.

Da su se direktoriji izvora i odredišta zvali isto, na primjer, kada bismo kopirali iz /source u /home/source, mogli bismo koristiti naredbu:

cp -a /source /home

I nakon kopiranja, datoteke u /home/source bi bile dopunjene datotekama iz /source.

Evo logičkog zadatka: možemo dopuniti datoteke u direktoriju odredišta, ako se direktoriji zovu isto, ali ako se razlikuju, direktorij izvor će biti smješten unutar odredišta. Kako kopirati datoteke iz /source u /target pomoću cp bez wildcards?

Da bismo zaobišli ovo štetno ograničenje, koristimo nekonvencionalno rješenje:

cp -a /source/. /target

Oni koji su dobro upoznati s DOS-om i Linuxom su već shvatili: unutar svake mape postoje 2 nevidljive mape ‘.’ i ‘..’, koje su lažne mape-linkovi na trenutni i nadređeni direktorij.

  • Pri kopiranju cp provjerava postojanje i nastoji stvoriti /target/.
  • Takav direktorij postoji i to je /target.
  • Datoteke iz /source su ispravno kopirane u /target.

Dakle, držimo to u mislima ili na zidu:

cp -a /source/. /target

Ponašanje ove naredbe je jasno. Sve će raditi bez grešaka, bez obzira na to imate li milijun datoteka ili ih nema.

Zaključci

Ako treba kopirati svi datoteke iz jednog direktorija u drugi, ne koristite wildcards, bolje je koristiti cp u kombinaciji s točkom na kraju direktorija izvora. Ovo će kopirati sve datoteke, uključujući skrivene i neće propasti pri milijunima datoteka ili potpunom odsustvu datoteka.

Epilog

vmspike predložio je sličnu naredbu s istim rezultatom:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

PAŽNJA: veličina slova T ima značaj. Ako pogriješite, dobit ćete potpuni nered: smjer kopiranja će se promijeniti.
Zahvale:

  • Tvrtki RUVDS.COM za podršku i mogućnost objave u svom blogu na Habr-ima.
  • Za sliku TripletConcept. Slika je vrlo velika i detaljna, može se otvoriti u posebnom prozoru.

P.S. Uočene greške šaljite u privatnu poruku. Tako ću povisiti karamu za to.

Tim cp: ispravno kopiranje mapa s datotekama u *nix

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster