cp විධානය: *nix හි ගොනු ෆෝල්ඩර නිවැරදිව පිටපත් කිරීම

cp විධානය: *nix හි ගොනු ෆෝල්ඩර නිවැරදිව පිටපත් කිරීම

භාවිතයට අදාළ නොපැහැදිලි කරුණු කිහිපයක් මෙම ලිපියෙන් හෙළි කරනු ඇත Wildcards පිටපත් කිරීමේදී, අපැහැදිලි විධාන හැසිරීම cp පිටපත් කිරීමේදී මෙන්ම මඟ හැරීමෙන් හෝ බිඳ වැටීමකින් තොරව විශාල ගොනු සංඛ්‍යාවක් නිවැරදිව පිටපත් කිරීමට ඔබට ඉඩ සලසන ක්‍රම.

අපි හිතමු අපි හැම දෙයක්ම /source folder එකේ ඉඳන් /target කියන folder එකට කොපි කරන්න ඕන.

මතකයට එන පළමු දෙය නම්:

cp /source/* /target

අපි වහාම මෙම විධානය නිවැරදි කරමු:

cp -a /source/* /target

ප්රධාන -a සියලු ගුණාංග, හිමිකම් පිටපත් කිරීම සහ පුනරාවර්තනය එකතු කරනු ඇත. අයිතිවාසිකම් පිළිබඳ නිශ්චිත ප්රතිනිෂ්පාදනය අවශ්ය නොවන විට, යතුරක් ප්රමාණවත් වේ -r.

පිටපත් කිරීමෙන් පසු, සියලුම ගොනු පිටපත් කර නොමැති බව අපට පෙනී යනු ඇත - වැනි තිතකින් ආරම්භ වන ගොනු:

.profile
.local
.mc

සහ ඒ හා සමාන ය.

මෙය සිදු වූයේ ඇයි?

වයිල්ඩ්කාඩ් සැකසෙන්නේ කවචය මගින් නිසා (bash සාමාන්ය අවස්ථාවක). පෙරනිමියෙන්, bash විසින් තිත් වලින් ආරම්භ වන සියලුම ගොනු නොසලකා හරිනු ඇත, මන්ද එය සැඟවුනු ඒවා ලෙස සලකයි. මෙම හැසිරීම වළක්වා ගැනීම සඳහා අපි හැසිරීම වෙනස් කළ යුතුය bash විධානය භාවිතා කරමින්:

shopt -s dotglob

නැවත පණගැන්වීමෙන් පසුව මෙම හැසිරීම් වෙනස්වීම දිගටම පවතින බව සහතික කිරීම සඳහා, ඔබට මෙම ෆෝල්ඩරය තුළ මෙම විධානය සමඟ Wildcard.sh ගොනුවක් සෑදිය හැක. /etc/profile.d (සමහරවිට ඔබේ බෙදාහැරීමට වෙනත් ෆෝල්ඩරයක් ඇත).

තවද මූලාශ්‍ර නාමාවලියෙහි ලිපිගොනු නොමැති නම්, කවචයට තරු ලකුණ වෙනුවට කිසිවක් ආදේශ කිරීමට නොහැකි වනු ඇති අතර, පිටපත් කිරීම ද දෝෂයක් සමඟ අසාර්ථක වනු ඇත. මෙම තත්වයට එරෙහිව විකල්ප තිබේ failglob и nullglob. අපි සකස් කිරීමට අවශ්ය වනු ඇත failglob, එය විධානය ක්‍රියාත්මක කිරීම වළක්වයි. nullglob ක්‍රියා නොකරනු ඇත, මන්ද එය ගැලපීමක් සොයා නොගත් වයිල්ඩ්කාඩ් සහිත තන්තුවක් හිස් තන්තුවක් (ශුන්‍ය දිග) බවට පරිවර්තනය කරයි, ඒ සඳහා cp දෝෂයක් ඇති කරයි.

කෙසේ වෙතත්, ෆෝල්ඩරයේ ගොනු දහස් ගණනක් හෝ වැඩි ගණනක් තිබේ නම්, Wildcards ප්රවේශය සම්පූර්ණයෙන්ම අත්හැරිය යුතුය. කාරණය එයයි bash Wildcards ඉතා දිගු විධාන රේඛාවක් දක්වා පුළුල් කරයි:

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
….

ඉතින්, අපි සම්පූර්ණයෙන්ම Wildcards නොමැතිව කරමු.

නිකමට ලියමු

cp -a /source /target

තවද මෙහිදී අපි හැසිරීමේ අපැහැදිලිත්වයට මුහුණ දී සිටිමු cp. / ඉලක්ක ෆෝල්ඩරය නොපවතියි නම්, එවිට අපට අවශ්ය දේ ලැබෙනු ඇත.

කෙසේ වෙතත්, ඉලක්ක ෆෝල්ඩරය පවතී නම්, එම ගොනු / ඉලක්කය/මූලාශ්‍ර ෆෝල්ඩරය වෙත පිටපත් කරනු ලැබේ.

අපට අවශ්‍ය ලිපිගොනු එහි අඩංගු විය හැකි බැවින් අපට සැමවිටම /ඉලක්ක ෆෝල්ඩරය කල්තියා මකා දැමිය නොහැක, උදාහරණයක් ලෙස, අපගේ ඉලක්කය වන්නේ /මුලාශ්‍රයේ ගොනු සමඟ /ඉලක්කයේ ඇති ගොනු පරිපූරණය කිරීමයි.

මූලාශ්‍ර සහ ගමනාන්ත ෆෝල්ඩර එකම නම් කර ඇත්නම්, උදාහරණයක් ලෙස, අපි /source සිට /home/source වෙත පිටපත් කරමින් සිටියෙමු, එවිට අපට විධානය භාවිතා කළ හැක:

cp -a /source /home

සහ පිටපත් කිරීමෙන් පසු, /home/source හි ඇති ගොනු /source වෙතින් ගොනු සමඟ අතිරේක වනු ඇත.

මෙය තාර්කික ගැටළුවකි: ෆෝල්ඩර එකම නම් කර ඇත්නම් අපට ගමනාන්ත නාමාවලියට ගොනු එකතු කළ හැකිය, නමුත් ඒවා වෙනස් නම්, ප්‍රභව ෆෝල්ඩරය ගමනාන්තය තුළ තබනු ඇත. Wildcards නොමැතිව cp භාවිතයෙන් /source සිට /target වෙත ගොනු පිටපත් කරන්නේ කෙසේද?

මෙම හානිකර සීමාව මඟහරවා ගැනීම සඳහා, අපි පැහැදිලි නොවන විසඳුමක් භාවිතා කරමු:

cp -a /source/. /target

DOS සහ Linux ගැන හුරුපුරුදු අය දැනටමත් සියල්ල තේරුම් ගෙන ඇත: එක් එක් ෆෝල්ඩරය තුළ නොපෙනෙන ෆෝල්ඩර 2 ක් ඇත "." සහ “..”, එනම් වත්මන් සහ ඉහළ නාමාවලි වෙත ව්‍යාජ ෆෝල්ඩර සබැඳි වේ.

  • පිටපත් කරන විට cp පැවැත්ම පරීක්ෂා කර /ඉලක්ක/ නිර්මාණය කිරීමට උත්සාහ කරයි.
  • එවැනි නාමාවලියක් පවතින අතර එය / ඉලක්කය වේ
  • / මූලාශ්‍රයෙන් ගොනු නිවැරදිව / ඉලක්ක වෙත පිටපත් කර ඇත.

එබැවින්, එය ඔබේ මතකයේ හෝ බිත්තියේ තද රාමුවක එල්ලන්න:

cp -a /source/. /target

මෙම විධානයේ හැසිරීම පැහැදිලිය. ඔබ සතුව ගොනු මිලියනයක් තිබේද නැතහොත් කිසිවක් නොමැති වුවද, සෑම දෙයක්ම දෝෂයකින් තොරව ක්‍රියා කරයි.

සොයා ගැනීම්

ඔබට පිටපත් කිරීමට අවශ්ය නම් සියල්ල ගොනු එක් ෆෝල්ඩරයකින් තවත් ෆෝල්ඩරයකට, අපි Wildcards භාවිතා නොකරමු, ඒ වෙනුවට ඒවා භාවිතා කිරීම වඩා හොඳය cp මූලාශ්‍ර ෆෝල්ඩරයේ අවසානයේ ඇති කාල පරිච්ඡේදයක් සමඟ ඒකාබද්ධ වේ. මෙය සැඟවුණු ගොනු ඇතුළුව සියලුම ගොනු පිටපත් කරනු ඇති අතර, ගොනු මිලියන ගණනකින් හෝ කිසිඳු ගොනුවක් නොමැතිව අසාර්ථක නොවනු ඇත.

පසු පදය

vmspike සමාන ප්‍රතිඵලයක් සහිත විධාන අනුවාදයක් යෝජනා කළේය:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

සටහන: ලිපි නඩුව T අර්ථය ඇත. ඔබ එය මිශ්ර කළහොත්, ඔබට සම්පූර්ණ කුණු ලැබෙනු ඇත: පිටපත් කිරීමේ දිශාව වෙනස් වනු ඇත.
ස්තුතියි:

  • සමාගම් RUVDS.COM සහාය සඳහා සහ Habré හි ඔබේ බ්ලොගයේ ප්‍රකාශනය කිරීමට අවස්ථාව.
  • රූපය අනුව ත්රිත්ව සංකල්පය. පින්තූරය ඉතා විශාල හා සවිස්තරාත්මක ය, වෙනම කවුළුවකින් විවෘත කළ හැකිය.

ප්රාදේශීය සභා කරුණාකර පුද්ගලික පණිවිඩයක ඔබ දකින යම් දෝෂයක් එවන්න. මම මේ සඳහා මගේ කර්මය වැඩි කරමි.

cp විධානය: *nix හි ගොනු ෆෝල්ඩර නිවැරදිව පිටපත් කිරීම

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න