Энэ нийтлэл нь ашиглахтай холбоотой зарим тодорхой бус зүйлсийг илчлэх болно 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
эх хавтасны төгсгөлд цэгтэй хослуулсан. Энэ нь далд файлыг оруулаад бүх файлыг хуулах бөгөөд сая сая файлтай эсвэл огт файлгүй ч ажиллахгүй.
Дараах үгс
cp -a -T /source /target
cp -aT /source /target
ЖИЧ: захидлын хэрэг T
гэсэн утгатай. Хэрэв та үүнийг холих юм бол та бүрэн хог хаягдал авах болно: хуулбарлах чиглэл өөрчлөгдөнө.
Талархал:
- Компани
RUVDS.COM дэмжлэг болон Habré дээр өөрийн блог дээр нийтлэх боломж. - Зураг тус бүрээр
Гурвалсан ойлголт . Зураг нь маш том бөгөөд нарийвчилсан, тусдаа цонхонд нээгдэх боломжтой.
PS Та анзаарсан алдаагаа хувийн мессежээр илгээнэ үү. Үүний тулд би үйлийн үрээ нэмэгдүүлдэг.
Эх сурвалж: www.habr.com