ពាក្យបញ្ជា cp៖ ចម្លងថតឯកសារឱ្យបានត្រឹមត្រូវក្នុង *nix

ពាក្យបញ្ជា cp៖ ចម្លងថតឯកសារឱ្យបានត្រឹមត្រូវក្នុង *nix

អត្ថបទនេះនឹងបង្ហាញពីអ្វីដែលមិនច្បាស់លាស់មួយចំនួនទាក់ទងនឹងការប្រើប្រាស់ អក្សរជំនួស នៅពេលចម្លង ឥរិយាបថពាក្យបញ្ជាមិនច្បាស់លាស់ cp នៅពេលចម្លង ក៏ដូចជាវិធីសាស្រ្តដែលអនុញ្ញាតឱ្យអ្នកចម្លងឯកសារមួយចំនួនធំបានត្រឹមត្រូវដោយមិនរំលង ឬគាំង។

ចូរនិយាយថាយើងត្រូវចម្លងអ្វីគ្រប់យ៉ាងពីថត /source ទៅថត /target ។

រឿងដំបូងដែលគិតគឺ៖

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 នឹងបណ្តាលឱ្យមានកំហុស។

ទោះយ៉ាងណាក៏ដោយ ប្រសិនបើមានឯកសាររាប់ពាន់ ឬច្រើនជាងនេះនៅក្នុងថតនោះ វិធីសាស្ត្រជំនួសគួរតែត្រូវបោះបង់ចោលទាំងអស់គ្នា។ ការពិតគឺថា 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 ដោយគ្មានអក្សរជំនួស?

ដើម្បីទទួលបានដែនកំណត់ដ៏គ្រោះថ្នាក់នេះ យើងប្រើដំណោះស្រាយដែលមិនច្បាស់លាស់៖

cp -a /source/. /target

អ្នកទាំងឡាយណាដែលស្គាល់ DOS និង Linux បានយល់គ្រប់យ៉ាងរួចហើយ៖ នៅខាងក្នុងថតនីមួយៗមាន 2 ថតដែលមើលមិនឃើញ "" ។ និង ".." ដែលជាថតឯកសារភ្ជាប់ទៅថតបច្ចុប្បន្ន និងខ្ពស់ជាងនេះ។

  • នៅពេលចម្លង cp ពិនិត្យរកអត្ថិភាព ហើយព្យាយាមបង្កើត /target/ ។
  • ថតបែបនេះមាន ហើយវាគឺជា / គោលដៅ
  • ឯកសារពី /source ត្រូវបានចម្លងទៅ /target យ៉ាងត្រឹមត្រូវ។

ដូច្នេះ សូមព្យួរវានៅក្នុងស៊ុមដិតមួយនៅក្នុងការចងចាំរបស់អ្នក ឬនៅលើជញ្ជាំង៖

cp -a /source/. /target

ឥរិយាបថនៃពាក្យបញ្ជានេះគឺច្បាស់។ អ្វីៗនឹងដំណើរការដោយគ្មានកំហុស មិនថាអ្នកមានឯកសារមួយលាន ឬគ្មានឯកសារអ្វីទាំងអស់។

ការរកឃើញ

ប្រសិនបើអ្នកត្រូវការចម្លង ទាំងអស់ ឯកសារពីថតមួយទៅថតមួយទៀត យើងមិនប្រើអក្សរជំនួសទេ វាជាការប្រសើរក្នុងការប្រើពួកវាជំនួសវិញ។ cp រួមបញ្ចូលជាមួយរយៈពេលនៅចុងបញ្ចប់នៃថតប្រភព។ វានឹងចម្លងឯកសារទាំងអស់ រួមទាំងឯកសារដែលលាក់ ហើយនឹងមិនបរាជ័យជាមួយឯកសាររាប់លាន ឬគ្មានឯកសារអ្វីទាំងអស់។

Afterword

vmspike បានស្នើកំណែពាក្យបញ្ជាដែលមានលទ្ធផលស្រដៀងគ្នា៖

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

ចំណាំ៖ ករណីអក្សរ T មានអត្ថន័យ។ ប្រសិនបើអ្នកលាយវា អ្នកនឹងទទួលបានសំរាមទាំងស្រុង៖ ទិសដៅចម្លងនឹងផ្លាស់ប្តូរ។
សូមអរគុណ៖

  • ក្រុមហ៊ុន RUVDS.COM សម្រាប់ការគាំទ្រ និងឱកាសដើម្បីផ្សព្វផ្សាយនៅលើប្លក់របស់អ្នកនៅលើ Habre ។
  • តាមរូបភាព គំនិតបី. រូបភាពមានទំហំធំ និងលម្អិតអាចបើកក្នុងបង្អួចដាច់ដោយឡែក។

PS សូមផ្ញើកំហុសណាមួយដែលអ្នកកត់សម្គាល់នៅក្នុងសារឯកជន។ ខ្ញុំបង្កើនកម្មផលរបស់ខ្ញុំសម្រាប់រឿងនេះ។

ពាក្យបញ្ជា cp៖ ចម្លងថតឯកសារឱ្យបានត្រឹមត្រូវក្នុង *nix

ប្រភព: www.habr.com

បន្ថែមមតិយោបល់