cp கட்டளை: *nix இல் கோப்பு கோப்புறைகளை சரியாக நகலெடுக்கிறது
இந்த கட்டுரையின் பயன்பாடு தொடர்பான சில வெளிப்படையான விஷயங்களை வெளிப்படுத்தும் காட்டு அட்டைகள் நகலெடுக்கும் போது, தெளிவற்ற கட்டளை நடத்தை cp நகலெடுக்கும் போது, அத்துடன் ஒரு பெரிய எண்ணிக்கையிலான கோப்புகளை தவிர்க்க அல்லது செயலிழக்காமல் சரியாக நகலெடுக்க அனுமதிக்கும் முறைகள்.
/source கோப்புறையிலிருந்து / இலக்கு கோப்புறைக்கு அனைத்தையும் நகலெடுக்க வேண்டும் என்று வைத்துக்கொள்வோம்.
நினைவுக்கு வரும் முதல் விஷயம்:
cp /source/* /target
இந்த கட்டளையை உடனடியாக சரிசெய்வோம்:
cp -a /source/* /target
முக்கிய -a அனைத்து பண்புக்கூறுகளையும், உரிமைகளையும் நகலெடுத்து, மறுநிகழ்வைச் சேர்க்கும். உரிமைகளின் சரியான மறுஉருவாக்கம் தேவையில்லை என்றால், ஒரு விசை போதுமானது -r.
நகலெடுத்த பிறகு, எல்லா கோப்புகளும் நகலெடுக்கப்படவில்லை என்பதைக் கண்டுபிடிப்போம் - இது போன்ற ஒரு புள்ளியுடன் தொடங்கும் கோப்புகள்:
.profile
.local
.mc
மற்றும் போன்றவை.
இது ஏன் நடந்தது?
ஏனெனில் வைல்டு கார்டுகள் ஷெல் மூலம் செயலாக்கப்படுகின்றன (bash ஒரு பொதுவான வழக்கில்). இயல்பாக, புள்ளிகளுடன் தொடங்கும் அனைத்து கோப்புகளையும் பாஷ் புறக்கணிக்கும், ஏனெனில் அது மறைக்கப்பட்டதாகக் கருதுகிறது. இந்த நடத்தை தவிர்க்க நாம் நடத்தை மாற்ற வேண்டும் bash கட்டளையைப் பயன்படுத்தி:
shopt -s dotglob
மறுதொடக்கத்திற்குப் பிறகும் இந்த நடத்தை மாற்றம் தொடர்வதை உறுதிசெய்ய, கோப்புறையில் இந்தக் கட்டளையுடன் Wildcard.sh கோப்பை உருவாக்கலாம். /etc/profile.d (ஒருவேளை உங்கள் விநியோகத்தில் வேறு கோப்புறை இருக்கலாம்).
மூல கோப்பகத்தில் கோப்புகள் இல்லை என்றால், ஷெல் நட்சத்திரத்திற்கு பதிலாக எதையும் மாற்ற முடியாது, மேலும் நகலெடுப்பதும் பிழையுடன் தோல்வியடையும். இந்த சூழ்நிலைக்கு எதிரான விருப்பங்கள் உள்ளன failglob и nullglob. நாம் அமைக்க வேண்டும் failglob, இது கட்டளையை செயல்படுத்துவதைத் தடுக்கும். nullglob பொருந்தாத வைல்டு கார்டுகளுடன் ஒரு சரத்தை வெற்று சரமாக (பூஜ்ஜிய நீளம்) மாற்றுவதால், வேலை செய்யாது. cp பிழையை ஏற்படுத்தும்.
இருப்பினும், கோப்புறையில் ஆயிரக்கணக்கான அல்லது அதற்கு மேற்பட்ட கோப்புகள் இருந்தால், வைல்டு கார்டு அணுகுமுறை முற்றிலும் கைவிடப்பட வேண்டும். உண்மை அதுதான் 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/source கோப்புறைக்கு நகலெடுக்கப்படும்.
/இலக்குக் கோப்புறையை எப்பொழுதும் முன்கூட்டியே நீக்க முடியாது, ஏனெனில் அதில் நமக்குத் தேவையான கோப்புகள் இருக்கலாம் மற்றும் எங்களின் குறிக்கோள், எடுத்துக்காட்டாக, /மூலத்தில் உள்ள கோப்புகளுடன் /இலக்குகளில் உள்ள கோப்புகளை கூடுதலாகச் சேர்ப்பதாகும்.
மூல மற்றும் இலக்கு கோப்புறைகள் ஒரே மாதிரியாக பெயரிடப்பட்டிருந்தால், எடுத்துக்காட்டாக, நாம் /source இலிருந்து /home/source க்கு நகலெடுக்கிறோம், பின்னர் கட்டளையைப் பயன்படுத்தலாம்:
cp -a /source /home
நகலெடுத்த பிறகு, /home/source இல் உள்ள கோப்புகள் /source இன் கோப்புகளுடன் கூடுதலாக சேர்க்கப்படும்.
இது ஒரு தர்க்கரீதியான சிக்கல்: கோப்புறைகள் ஒரே மாதிரியாக பெயரிடப்பட்டால், இலக்கு கோப்பகத்தில் கோப்புகளைச் சேர்க்கலாம், ஆனால் அவை வேறுபட்டால், மூலக் கோப்புறை இலக்குக்குள் வைக்கப்படும். வைல்டு கார்டுகள் இல்லாமல் cp ஐப் பயன்படுத்தி /மூலத்திலிருந்து /இலக்குக்கு கோப்புகளை நகலெடுப்பது எப்படி?
இந்தத் தீங்கான வரம்பைத் தவிர்க்க, நாங்கள் வெளிப்படையான தீர்வைப் பயன்படுத்துகிறோம்:
cp -a /source/. /target
DOS மற்றும் Linux ஐ நன்கு அறிந்தவர்கள் ஏற்கனவே எல்லாவற்றையும் புரிந்து கொண்டுள்ளனர்: ஒவ்வொரு கோப்புறையிலும் 2 கண்ணுக்கு தெரியாத கோப்புறைகள் உள்ளன "." மற்றும் “..”, அவை தற்போதைய மற்றும் உயர் கோப்பகங்களுக்கான போலி கோப்புறை இணைப்புகள்.
நகலெடுக்கும் போது cp இருப்பை சரிபார்த்து /இலக்கு/ உருவாக்க முயற்சிக்கிறது.
அத்தகைய அடைவு உள்ளது மற்றும் அது / இலக்கு
/மூலத்திலிருந்து கோப்புகள் சரியாக /இலக்குக்கு நகலெடுக்கப்படுகின்றன.
எனவே, அதை உங்கள் நினைவகத்தில் அல்லது சுவரில் ஒரு தடித்த சட்டகத்தில் தொங்க விடுங்கள்:
cp -a /source/. /target
இந்த கட்டளையின் நடத்தை தெளிவாக உள்ளது. உங்களிடம் ஒரு மில்லியன் கோப்புகள் உள்ளதா அல்லது எதுவுமில்லையா என்பதைப் பொருட்படுத்தாமல் அனைத்தும் பிழைகள் இல்லாமல் செயல்படும்.
கண்டுபிடிப்புகள்
நீங்கள் நகலெடுக்க வேண்டும் என்றால் அனைத்து ஒரு கோப்புறையிலிருந்து மற்றொரு கோப்புறைக்கு கோப்புகள், நாங்கள் வைல்டு கார்டுகளைப் பயன்படுத்துவதில்லை, அதற்குப் பதிலாக அவற்றைப் பயன்படுத்துவது நல்லது cp மூல கோப்புறையின் முடிவில் உள்ள ஒரு காலகட்டத்துடன் இணைந்து. இது மறைக்கப்பட்டவை உட்பட அனைத்து கோப்புகளையும் நகலெடுக்கும், மேலும் மில்லியன் கணக்கான கோப்புகள் அல்லது கோப்புகள் இல்லாமல் தோல்வியடையாது.