
U ovom članku bit će razjašnjene neke nejasne stvari vezane uz korištenje 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/* /targetOdmah ć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 …… /targetZa duljinu naredbene linije postoji ograničenje koje možemo saznati korištenjem naredbe:
getconf ARG_MAXDobit ćemo maksimalnu duljinu naredbene linije u bajtovima:
2097152Ili:
xargs --show-limitsDobit ć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 /homeI 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/. /targetOni 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
cpprovjerava 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
predložio je sličnu naredbu s istim rezultatom:
cp -a -T /source /target
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 za podršku i mogućnost objave u svom blogu na Habr-ima.
- Za sliku . 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.
Izvor: habr.com
