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
  • /эх сурвалжаас файлуудыг /target руу зөв хуулсан.

Тиймээс үүнийг санах ойндоо эсвэл хананд тод жаазанд өлгө.

cp -a /source/. /target

Энэ тушаалын үйлдэл нь тодорхой байна. Танд сая файл байгаа эсэхээс үл хамааран бүх зүйл алдаагүй ажиллах болно.

үр дүн нь

Хэрэв та хуулбарлах шаардлагатай бол бүх файлуудыг нэг фолдероос нөгөө хавтас руу шилжүүлэхэд бид орлуулагдах тэмдэг ашигладаггүй, оронд нь ашиглах нь дээр cp эх хавтасны төгсгөлд цэгтэй хослуулсан. Энэ нь далд файлыг оруулаад бүх файлыг хуулах бөгөөд сая сая файлтай эсвэл огт файлгүй ч ажиллахгүй.

Дараах үгс

vmspike ижил төстэй үр дүн бүхий тушаалын хувилбарыг санал болгосон:

cp -a -T /source /target

Оз_Алекс

cp -aT /source /target

ЖИЧ: захидлын хэрэг T гэсэн утгатай. Хэрэв та үүнийг холих юм бол та бүрэн хог хаягдал авах болно: хуулбарлах чиглэл өөрчлөгдөнө.
Талархал:

  • Компани RUVDS.COM дэмжлэг болон Habré дээр өөрийн блог дээр нийтлэх боломж.
  • Зураг тус бүрээр Гурвалсан ойлголт. Зураг нь маш том бөгөөд нарийвчилсан, тусдаа цонхонд нээгдэх боломжтой.

PS Та анзаарсан алдаагаа хувийн мессежээр илгээнэ үү. Үүний тулд би үйлийн үрээ нэмэгдүүлдэг.

cp тушаал: *nix доторх файлын хавтсыг зөв хуулах

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх