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 бастапқы қалтаның соңындағы нүктемен біріктірілген. Бұл барлық файлдарды, соның ішінде жасырын файлдарды көшіреді және миллиондаған файлдармен немесе мүлде файлдармен жұмыс істемейді.

Кейінгі сөз

vmspike ұқсас нәтиже бар пәрмен нұсқасын ұсынды:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

ЕСКЕРТПЕ: әріптік регистр T мағынасы бар. Егер сіз оны араластырсаңыз, сіз толық қоқыс аласыз: көшіру бағыты өзгереді.
Спасибо:

  • Компаниялар RUVDS.COM қолдау және Habré блогында жариялау мүмкіндігі үшін.
  • Сурет бойынша Үштік тұжырымдама. Сурет өте үлкен және егжей-тегжейлі, оны бөлек терезеде ашуға болады.

PS Байқаған қателерді жеке хабарламада жіберіңіз. Мен бұл үшін кармамды арттырамын.

cp пәрмені: файл қалталарын *nix ішіне дұрыс көшіріңіз

Ақпарат көзі: www.habr.com

пікір қалдыру