cp buyrug'i: fayl papkalarini * nix ga to'g'ri nusxalash

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:

cp -a -T /source /target

Oz_Aleks

cp -aT /source /target

QAYD: harflar ishi T ma'noga ega. Agar siz uni aralashtirsangiz, siz butunlay axlatga ega bo'lasiz: nusxa ko'chirish yo'nalishi o'zgaradi.
Rahmat:

  • Kompaniyalar RUVDS.COM qo'llab-quvvatlash va HabrΓ©-dagi blogingizda nashr qilish imkoniyati uchun.
  • Rasm uchun Uchlik tushunchasi. Rasm juda katta va batafsil, alohida oynada ochilishi mumkin.

PS Iltimos, ko'rgan xatolaringizni shaxsiy xabar orqali yuboring. Buning uchun karmani oshiraman.

cp buyrug'i: fayl papkalarini * nix ga to'g'ri nusxalash

Manba: www.habr.com

a Izoh qo'shish