cp kòmand: kòrèkteman kopye dosye dosye nan * nix

cp kòmand: kòrèkteman kopye dosye dosye nan * nix

Atik sa a pral revele kèk bagay ki pa evidan ki gen rapò ak itilizasyon wildcards lè kopye, konpòtman anbigwis kòmand cp lè kopye, osi byen ke metòd ki pèmèt ou kòrèkteman kopye yon gwo kantite dosye san yo pa sote oswa ekraze.

Ann di nou bezwen kopye tout bagay soti nan katab la / sous nan katab la / sib.

Premye bagay ki vin nan tèt ou se:

cp /source/* /target

Ann korije kòmandman sa a imedyatman:

cp -a /source/* /target

Kle -a pral ajoute kopye tout atribi, dwa epi ajoute rekursion. Lè repwodiksyon egzak dwa yo pa obligatwa, yon kle se ase -r.

Apre kopye, nou pral jwenn ke se pa tout dosye yo te kopye - dosye ki kòmanse ak yon pwen tankou:

.profile
.local
.mc

ak renmen an.

Poukisa sa te rive?

Paske joker yo trete pa koki a (bash nan yon ka tipik). Pa default, bash pral inyore tout dosye ki kòmanse ak pwen, paske li trete yo kòm kache. Pou evite konpòtman sa a nou pral oblije chanje konpòtman bash lè l sèvi avèk kòmandman an:

shopt -s dotglob

Pou asire ke chanjman konpòtman sa a pèsiste apre yon rdemare, ou ka kreye yon fichye wildcard.sh ak lòd sa a nan katab la. /etc/profile.d (Petèt distribisyon ou a gen yon katab diferan).

Men, si pa gen okenn dosye nan anyè sous la, Lè sa a, koki a pa yo pral kapab ranplase anyen nan plas asterisk la, epi kopye pral echwe tou ak yon erè. Gen opsyon kont sitiyasyon sa a failglob и nullglob. Nou pral bezwen mete failglob, ki pral anpeche kòmandman an yo te egzekite. nullglob pa pral travay, paske li konvèti yon fisèl ak joker ki pa jwenn yon match nan yon fisèl vid (zewo longè), ki pou cp pral lakòz yon erè.

Sepandan, si gen dè milye de dosye oswa plis nan katab la, Lè sa a, apwòch la wildcards yo ta dwe abandone tout ansanm. Reyalite a se ke bash elaji wildcards nan yon liy kòmand trè long tankou:

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

Gen yon limit sou longè liy lòd la, ke nou ka jwenn lè l sèvi avèk lòd la:

getconf ARG_MAX

Ann jwenn longè maksimòm liy lòd la an byte:

2097152

Или:

xargs --show-limits

Nou jwenn yon bagay tankou:

….
Maximum length of command we could actually use: 2089314
….

Se konsa, an n fè san jokers tout ansanm.

Ann jis ekri

cp -a /source /target

Ak isit la nou ap fè fas ak anbigwite nan konpòtman cp. Si folder nan / target pa egziste, Lè sa a, nou pral jwenn sa nou bezwen.

Sepandan, si katab la sib egziste, Lè sa a, dosye yo pral kopye nan katab la / sib / sous.

Nou pa ka toujou efase katab / target la davans, paske li ka genyen fichye nou bezwen e objektif nou, pa egzanp, se konplete dosye yo nan / target ak fichye ki soti nan / source.

Si dosye sous ak destinasyon yo te rele menm jan an, pou egzanp, nou t ap kopye soti nan /source nan /home/source, Lè sa a, nou ta ka itilize kòmandman an:

cp -a /source /home

Apre sa, apre yo fin kopye, dosye yo nan /home/source ta dwe konplete ak dosye ki soti nan /source.

Sa a se yon pwoblèm ki lojik: nou ka ajoute dosye nan anyè destinasyon an si dosye yo rele menm jan, men si yo diferan, Lè sa a, katab sous la pral mete andedan destinasyon an. Ki jan yo kopye dosye ki soti nan / sous nan / sib lè l sèvi avèk cp san yo pa joker?

Pou evite limit danjere sa a, nou itilize yon solisyon ki pa evidan:

cp -a /source/. /target

Moun ki abitye ak DOS ak Linux deja konprann tout bagay: andedan chak katab gen 2 dosye envizib "." ak "..", ki se pseudo-dosye lyen ki mennen nan anyè aktyèl ak pi wo yo.

  • Lè kopye cp tcheke pou egzistans ak eseye kreye / sib /.
  • Yon anyè konsa egziste e li se / target
  • Fichye ki soti nan /source yo kopye nan /sib kòrèkteman.

Se konsa, pann li nan yon ankadreman fonse nan memwa ou oswa sou miray la:

cp -a /source/. /target

Konpòtman kòmandman sa a klè. Tout pral travay san erè, kèlkeswa si ou gen yon milyon dosye oswa pa gen okenn nan tout.

Jwenn

Si ou bezwen kopye tout fichye soti nan yon katab nan yon lòt, nou pa itilize wildcards, li pi bon pou itilize yo pito cp konbine avèk yon peryòd nan fen katab sous la. Sa a pral kopye tout dosye, ki gen ladan sa yo kache, epi li pa pral febli ak dè milyon de dosye oswa pa gen okenn dosye ditou.

Apreword

vmspike sijere yon vèsyon kòmand ak yon rezilta menm jan an:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

REMAK: lèt ka T gen siyifikasyon an. Si ou melanje li, ou pral jwenn fatra konplè: direksyon kopi a pral chanje.
Mèsi:

  • Konpayi yo RUVDS.COM pou sipò ak opòtinite pou pibliye sou blog ou sou Habré.
  • Pou chak imaj Konsèp trip. Foto a se gwo anpil ak detaye, yo ka louvri nan yon fenèt separe.

PS Tanpri voye nenpòt erè ou remake nan yon mesaj prive. Mwen ogmante karma mwen pou sa.

cp kòmand: kòrèkteman kopye dosye dosye nan * nix

Sous: www.habr.com

Add nouvo kòmantè