cp հրաման՝ ճիշտ պատճենել ֆայլերի թղթապանակները *nix-ում

cp հրաման՝ ճիշտ պատճենել ֆայլերի թղթապանակները *nix-ում

Այս հոդվածը կբացահայտի որոշ ոչ ակնհայտ բաներ՝ կապված օգտագործման հետ վայրի խցիկներ պատճենելիս, երկիմաստ հրամանի վարքագիծ cp պատճենելիս, ինչպես նաև մեթոդներ, որոնք թույլ են տալիս ճիշտ պատճենել հսկայական թվով ֆայլեր՝ առանց բաց թողնելու կամ խափանելու:

Ենթադրենք, մենք պետք է պատճենենք ամեն ինչ /source պանակից մինչև /target թղթապանակ:

Առաջին բանը, որ գալիս է մտքին, հետևյալն է.

cp /source/* /target

Եկեք անմիջապես ուղղենք այս հրամանը հետևյալ կերպ.

cp -a /source/* /target

Բանալին -a կավելացնի բոլոր հատկանիշների պատճենումը, իրավունքները և կավելացնի ռեկուրսիա: Երբ իրավունքների ճշգրիտ վերարտադրումը չի պահանջվում, բանալին բավարար է -r.

Պատճենելուց հետո մենք կտեսնենք, որ ոչ բոլոր ֆայլերն են պատճենվել. ֆայլերը սկսվում են այնպիսի կետով, ինչպիսին է.

.profile
.local
.mc

և նմանները:

Ինչու՞ դա տեղի ունեցավ:

Քանի որ wildcards մշակվում են shell-ի կողմից (bash բնորոշ դեպքում): Լռելյայնորեն, bash-ը անտեսում է բոլոր ֆայլերը, որոնք սկսվում են կետերով, քանի որ դրանք վերաբերվում են որպես թաքնված: Այս պահվածքից խուսափելու համար մենք ստիպված կլինենք փոխել վարքագիծը bash օգտագործելով հրամանը.

shopt -s dotglob

Ապահովելու համար, որ այս վարքագծի փոփոխությունը պահպանվում է վերաբեռնումից հետո, դուք կարող եք ստեղծել wildcard.sh ֆայլ այս հրամանով թղթապանակում: /etc/profile.d (Գուցե ձեր բաշխումն այլ թղթապանակ ունի):

Եվ եթե սկզբնաղբյուրի գրացուցակում ֆայլեր չկան, ապա կեղևը չի կարողանա որևէ բան փոխարինել աստղանիշի փոխարեն, և պատճենումը նույնպես սխալմամբ չի հաջողվի: Այս իրավիճակի դեմ տարբերակներ կան failglob и nullglob. Մեզ անհրաժեշտ կլինի սահմանել failglob, որը կկանխի հրամանի կատարումը։ nullglob չի աշխատի, քանի որ այն փոխակերպում է համընկնող նշաններ ունեցող տողը դատարկ տողի (զրոյական երկարություն), որը cp սխալ կառաջացնի:

Այնուամենայնիվ, եթե թղթապանակում կան հազարավոր կամ ավելի ֆայլեր, ապա wildcards մոտեցումը պետք է ընդհանրապես հրաժարվել: Փաստն այն է, որ bash ընդլայնում է նիշերը շատ երկար հրամանի տողի մեջ, ինչպիսին է.

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

Կա հրամանի տողի երկարության սահմանափակում, որը մենք կարող ենք պարզել՝ օգտագործելով հրամանը.

getconf ARG_MAX

Եկեք ստանանք հրամանի տողի առավելագույն երկարությունը բայթերով.

2097152

Или:

xargs --show-limits

Մենք ստանում ենք նման բան.

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

Այսպիսով, եկեք ընդհանրապես անենք առանց վիրտուալ նշանների:

Եկեք ուղղակի գրենք

cp -a /source /target

Եվ այստեղ մենք բախվում ենք վարքագծի երկիմաստության հետ cp. Եթե ​​/target թղթապանակը գոյություն չունի, ապա մենք կստանանք այն, ինչ մեզ անհրաժեշտ է։

Այնուամենայնիվ, եթե թիրախային թղթապանակը գոյություն ունի, ապա ֆայլերը կպատճենվեն /target/source թղթապանակում:

Մենք չենք կարող միշտ ջնջել /target թղթապանակը նախապես, քանի որ այն կարող է պարունակել մեզ անհրաժեշտ ֆայլեր, և մեր նպատակն է, օրինակ, /target-ի ֆայլերը լրացնել /source-ի ֆայլերով:

Եթե ​​սկզբնաղբյուրի և նպատակակետի թղթապանակների անունները նույնն էին, օրինակ, մենք պատճենում էինք /source-ից /home/source, ապա կարող էինք օգտագործել հրամանը.

cp -a /source /home

Եվ պատճենելուց հետո /home/source-ի ֆայլերը կհամալրվեն /source-ի ֆայլերով:

Սա տրամաբանական խնդիր է. մենք կարող ենք ֆայլեր ավելացնել նպատակակետի գրացուցակում, եթե թղթապանակները նույն անվանումն ունեն, բայց եթե դրանք տարբեր են, ապա սկզբնաղբյուր թղթապանակը կտեղադրվի նպատակակետի ներսում: Ինչպե՞ս պատճենել ֆայլերը /source-ից դեպի /target՝ օգտագործելով cp-ն առանց wildcards-ի:

Այս վնասակար սահմանափակումը շրջանցելու համար մենք օգտագործում ենք ոչ ակնհայտ լուծում.

cp -a /source/. /target

Նրանք, ովքեր ծանոթ են DOS-ին և Linux-ին, արդեն հասկացել են ամեն ինչ. յուրաքանչյուր թղթապանակի ներսում կա 2 անտեսանելի թղթապանակ: և «..», որոնք կեղծ թղթապանակների հղումներ են դեպի ընթացիկ և ավելի բարձր գրացուցակներ:

  • Պատճենելիս cp ստուգում է գոյությունը և փորձում է ստեղծել /target/:
  • Նման գրացուցակ գոյություն ունի և այն /target է
  • /source-ից ֆայլերը ճիշտ պատճենվում են / target:

Այսպիսով, կախեք այն հաստ շրջանակով ձեր հիշողության մեջ կամ պատին.

cp -a /source/. /target

Այս հրամանի վարքագիծը պարզ է. Ամեն ինչ կաշխատի առանց սխալների, անկախ նրանից, դուք ունեք մեկ միլիոն ֆայլ, թե ընդհանրապես չկա:

Արդյունքները

Եթե ​​Ձեզ անհրաժեշտ է պատճենել բոլորը ֆայլեր մի թղթապանակից մյուսը, մենք չենք օգտագործում wildcards, ավելի լավ է դրանք օգտագործել փոխարենը cp զուգորդվում է սկզբնաղբյուրի թղթապանակի վերջում գտնվող կետի հետ: Սա պատճենելու է բոլոր ֆայլերը, ներառյալ թաքնվածները, և չի ձախողվի միլիոնավոր ֆայլերի կամ ընդհանրապես ֆայլերի բացակայության դեպքում:

Հետո

vmspike առաջարկել է հրամանի տարբերակ՝ նմանատիպ արդյունքով.

cp -a -T /source /target

Օզ_Ալեքս

cp -aT /source /target

ԾԱՆՈԹԱԳՐՈՒԹՅՈՒՆ՝ նամակի գործ T իմաստ ունի. Եթե ​​խառնես, լրիվ զիբիլ կստանաս՝ պատճենահանման ուղղությունը կփոխվի։
Շնորհակալություն:

  • Ընկերություններ RUVDS.COM աջակցության և Habré-ում ձեր բլոգում հրապարակելու հնարավորության համար:
  • Ըստ պատկերի Եռակի հայեցակարգ. Նկարը շատ մեծ է և մանրամասն, կարելի է բացել առանձին պատուհանով։

PS Խնդրում ենք նկատած սխալները ուղարկել անձնական նամակով։ Ես մեծացնում եմ իմ կարման դրա համար:

cp հրաման՝ ճիշտ պատճենել ֆայլերի թղթապանակները *nix-ում

Source: www.habr.com

Добавить комментарий