cp буйругу: * nix ичинде файл папкаларын туура көчүрүү

cp буйругу: * nix ичинде файл папкаларын туура көчүрүү

Бул макалада колдонууга байланыштуу кээ бир ачык-айкын эмес нерселерди ачып берет коймочкалар көчүрүп жатканда, түшүнүксүз буйрук жүрүм-туруму cp көчүрүүдө, ошондой эле көп сандагы файлдарды өткөрүп жибербестен же бузулбастан туура көчүрүүгө мүмкүндүк берүүчү ыкмалар.

Баарын / булак папкасынан / максаттуу папкага көчүрүү керек дейли.

Биринчи ойго келген нерсе:

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 ичиндеги файлдарды /булактагы файлдар менен толуктоо.

Эгерде булак жана көздөгөн папкалардын аталышы бирдей болсо, мисалы, биз /булактан /home/sourceко көчүрүп жаткан болсок, анда биз буйрукту колдонсок болот:

cp -a /source /home

Жана көчүрүлгөндөн кийин, /home/source ичиндеги файлдар /source файлдары менен толукталат.

Бул логикалык маселе: эгер папкалардын аталышы бирдей болсо, биз көздөгөн каталогго файлдарды кошо алабыз, бирок алар башка болсо, анда баштапкы папка көздөгөн жердин ичине жайгаштырылат. Файлдарды /булактан /максатына cp аркылуу кочкор белгилерсиз кантип көчүрүү керек?

Бул зыяндуу чектөөдөн өтүү үчүн биз ачык-айкын эмес чечимди колдонобуз:

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é боюнча блогуңузга жарыялоо мүмкүнчүлүгү үчүн.
  • Сүрөт боюнча Triple Concept. Сүрөт абдан чоң жана деталдуу, өзүнчө терезеде ачылса болот.

PS Сиз байкаган каталарды купуя кат аркылуу жөнөтүңүз. Бул үчүн кармамды көбөйтөм.

cp буйругу: * nix ичинде файл папкаларын туура көчүрүү

Source: www.habr.com

Комментарий кошуу