ProHoster > Блог > басқарма > 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 файлдарымен толықтырылады.
Бұл логикалық мәселе: егер қалталардың аты бірдей болса, файлдарды тағайындалған каталогқа қосуға болады, бірақ олар әртүрлі болса, бастапқы қалта тағайындалған орынның ішіне орналастырылады. Қойылмалы таңбаларсыз cp көмегімен файлдарды /source ішінен /target файлына қалай көшіруге болады?
Бұл зиянды шектеуді айналып өту үшін біз айқын емес шешімді қолданамыз:
cp -a /source/. /target
DOS және Linux-пен таныс адамдар бәрін түсінді: әр қалтаның ішінде 2 көрінбейтін «» қалталары бар. және ағымдағы және жоғарырақ каталогтарға жалған қалталар сілтемелері болып табылатын «..».
Көшіру кезінде cp бар-жоғын тексереді және /мақсат/ құруға тырысады.
Мұндай каталог бар және ол /target
/көзінен файлдар /target файлына дұрыс көшірілген.
Сондықтан оны жадыңызға немесе қабырғаға қалың жақтауға іліп қойыңыз:
cp -a /source/. /target
Бұл команданың әрекеті анық. Сізде миллиондаған файл бар ма, жоқ па, барлығы қатесіз жұмыс істейді.
қорытындылар
Көшіру керек болса барлық файлдарды бір қалтадан екіншісіне көшіру үшін біз қойылмалы таңбаларды қолданбаймыз, оның орнына оларды қолданған дұрыс cp бастапқы қалтаның соңындағы нүктемен біріктірілген. Бұл барлық файлдарды, соның ішінде жасырын файлдарды көшіреді және миллиондаған файлдармен немесе мүлде файлдармен жұмыс істемейді.