cp buyrug'i: fayl papkalarini * nix ga to'g'ri nusxalash
Ushbu maqola foydalanish bilan bog'liq ba'zi noaniq narsalarni ochib beradi joker belgilar nusxa ko'chirishda, noaniq buyruq harakati cp nusxa ko'chirishda, shuningdek, juda ko'p sonli fayllarni o'tkazib yubormasdan yoki buzilmasdan to'g'ri nusxalash imkonini beruvchi usullar.
Aytaylik, hamma narsani /source jildidan /target jildiga nusxalashimiz kerak.
Aqlga keladigan birinchi narsa:
cp /source/* /target
Keling, darhol ushbu buyruqni to'g'rilaymiz:
cp -a /source/* /target
Kalit -a barcha atributlar, huquqlar nusxasini qo'shadi va rekursiya qo'shadi. Huquqlarni aniq takrorlash talab qilinmasa, kalit etarli -r.
Nusxalashdan so'ng, biz hamma fayllar nusxalanmaganligini aniqlaymiz - nuqta bilan boshlanadigan fayllar:
.profile
.local
.mc
va shunga o'xshashlar.
Nima uchun bu sodir bo'ldi?
Chunki joker belgilar qobiq tomonidan qayta ishlanadi (bash odatiy holatda). Odatiy bo'lib, bash nuqta bilan boshlangan barcha fayllarni e'tiborsiz qoldiradi, chunki u ularni yashirin deb hisoblaydi. Bunday xatti-harakatning oldini olish uchun biz xatti-harakatlarimizni o'zgartirishimiz kerak bash buyruq yordamida:
shopt -s dotglob
Qayta ishga tushirilgandan so'ng bu xatti-harakat o'zgarishi davom etishini ta'minlash uchun papkada ushbu buyruq bilan wildcard.sh faylini yaratishingiz mumkin. /etc/profile.d (Ehtimol, sizning tarqatishingiz boshqa papkaga ega).
Va agar manba katalogida hech qanday fayl bo'lmasa, qobiq yulduzcha o'rniga hech narsani almashtira olmaydi va nusxalash ham xato bilan muvaffaqiyatsiz bo'ladi. Bunday vaziyatga qarshi variantlar mavjud failglob ΠΈ nullglob. Biz sozlashimiz kerak bo'ladi failglob, bu buyruqning bajarilishiga to'sqinlik qiladi. nullglob ishlamaydi, chunki u mos kelmaydigan joker belgilarli satrni bo'sh qatorga (nol uzunlik) aylantiradi. cp xatoga olib keladi.
Biroq, agar papkada minglab fayllar yoki undan ko'p bo'lsa, joker belgilar yondashuvidan butunlay voz kechish kerak. Gap shundaki bash joker belgilarni juda uzun buyruq qatoriga kengaytiradi:
cp -a /souce/a /source/b /source/c β¦β¦ /target
Buyruqlar satrining uzunligi bo'yicha cheklov mavjud, biz buni buyruq yordamida bilib olamiz:
getconf ARG_MAX
Buyruqlar satrining maksimal uzunligini baytlarda olamiz:
2097152
Yoki:
xargs --show-limits
Biz shunga o'xshash narsani olamiz:
β¦.
Maximum length of command we could actually use: 2089314
β¦.
Shunday qilib, keling, umuman joker belgilarsiz qilaylik.
Keling, shunchaki yozaylik
cp -a /source /target
Va bu erda biz xatti-harakatlarning noaniqligiga duch kelamiz cp. Agar /target papkasi mavjud bo'lmasa, biz kerakli narsani olamiz.
Biroq, agar maqsadli papka mavjud bo'lsa, fayllar /target/source papkasiga ko'chiriladi.
Biz har doim ham /target jildini oldindan o'chira olmaymiz, chunki unda bizga kerak bo'lgan fayllar bo'lishi mumkin va bizning maqsadimiz, masalan, /target ichidagi fayllarni /source fayllari bilan to'ldirishdir.
Agar manba va maqsad papkalar bir xil nomlangan bo'lsa, masalan, biz /source dan /home/source ga nusxa ko'chirayotgan bo'lsak, u holda buyruqni ishlatishimiz mumkin:
cp -a /source /home
Nusxalashdan so'ng, /home/source ichidagi fayllar /source fayli bilan to'ldiriladi.
Bu mantiqiy muammo: agar papkalar bir xil nomlangan bo'lsa, biz fayllarni maqsadli katalogga qo'shishimiz mumkin, ammo agar ular boshqacha bo'lsa, manba papkasi belgilangan joyga joylashtiriladi. Cp yordamida joker belgilarsiz fayllarni /source dan /target ga qanday nusxalash mumkin?
Ushbu zararli cheklovni engib o'tish uchun biz aniq bo'lmagan yechimdan foydalanamiz:
cp -a /source/. /target
DOS va Linux bilan tanish bo'lganlar allaqachon hamma narsani tushunishgan: har bir papka ichida ikkita ko'rinmas papka mavjud "." va "..", joriy va yuqoriroq kataloglarga psevdo-papkalar havolalari.
Nusxalashda cp mavjudligini tekshiradi va /target/ yaratishga harakat qiladi.
Bunday katalog mavjud va u /target
/source dan fayllar /target ga to'g'ri ko'chiriladi.
Shunday qilib, uni xotirangizga yoki devorga qalin ramkaga osib qo'ying:
cp -a /source/. /target
Ushbu buyruqning harakati aniq. Sizda millionlab fayl bormi yoki umuman yo'qligidan qat'i nazar, hamma narsa xatosiz ishlaydi.
topilmalar
Agar nusxa ko'chirish kerak bo'lsa hamma fayllarni bir papkadan boshqasiga o'tkazish uchun biz joker belgilarni ishlatmaymiz, ularning o'rniga ulardan foydalangan ma'qul cp manba papkasining oxiridagi nuqta bilan birlashtiriladi. Bu barcha fayllarni, shu jumladan yashirin fayllarni nusxalaydi va millionlab fayllar bilan yoki umuman fayl bilan ishlamay qoladi.
So'zdan keyin
vmspike shunga o'xshash natijaga ega buyruq versiyasini taklif qildi: