фармони cp: дуруст нусхабардории ҷузвдонҳои файл дар * nix

фармони cp: дуруст нусхабардории ҷузвдонҳои файл дар * nix

Ин мақола баъзе чизҳои норавшани марбут ба истифодаи онро ошкор хоҳад кард аломатҳои ҷонишин ҳангоми нусхабардорӣ, рафтори фармони норавшан cp ҳангоми нусхабардорӣ, инчунин усулҳое, ки ба шумо имкон медиҳанд шумораи зиёди файлҳоро бидуни гузариш ё садама дуруст нусхабардорӣ кунед.

Фарз мекунем, ки мо бояд ҳама чизро аз ҷузвдони /source ба ҷузвдони /target нусхабардорӣ кунем.

Аввалин чизе, ки ба хотир меояд, ин аст:

cp /source/* /target

Биёед фавран ин фармонро ислоҳ кунем:

cp -a /source/* /target

Калидвожа -a нусхабардории ҳама атрибутҳо, ҳуқуқҳо ва рекурсияро илова мекунад. Вақте ки таҷдиди дақиқи ҳуқуқҳо талаб карда намешавад, калид кофӣ аст -r.

Пас аз нусхабардорӣ, мо мебинем, ки на ҳама файлҳо нусхабардорӣ шудаанд - файлҳое, ки бо нуқта сар мешаванд, ба монанди:

.profile
.local
.mc

ва монанди инхо.

Чаро ин тавр шуд?

Азбаски аломатҳои ҷонишин аз ҷониби shell коркард карда мешаванд (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 якҷоя бо нуқта дар охири ҷузвдони манбаъ. Ин ҳама файлҳоро, аз ҷумла файлҳои пинҳониро нусхабардорӣ мекунад ва бо миллионҳо файлҳо хато намекунад ё тамоман файлҳо.

Пас аз он

vmspike версияи фармонро бо натиҷаи шабеҳ пешниҳод кард:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

ЭЗОҲ: парвандаи мактуб T маъно дорад. Агар шумо онро омехта кунед, шумо ахлотҳои пурра мегиред: самти нусхабардорӣ тағир меёбад.
Сипосгузорӣ:

  • Ширкатҳо RUVDS.COM барои дастгирӣ ва имкони нашр дар блоги худ дар Habré.
  • Ба як тасвир Консепсияи сегона. Тасвир хеле калон ва муфассал аст, онро дар равзанаи алоҳида кушодан мумкин аст.

PS Лутфан хатогиҳоеро, ки мебинед, дар паёми хусусӣ фиристед. Ман барои ин корамро зиёд мекунам.

фармони cp: дуруст нусхабардории ҷузвдонҳои файл дар * nix

Манбаъ: will.com

Илова Эзоҳ