cp əmri: *nix-də fayl qovluqlarının düzgün surətdə çıxarılması

cp əmri: *nix-də fayl qovluqlarının düzgün surətdə çıxarılması

Bu yazı istifadə ilə bağlı bəzi qeyri-aşkar şeyləri aşkar edəcək joker işarələr surət çıxararkən, birmənalı olmayan əmr davranışı cp kopyalayarkən, həmçinin çox sayda faylı atlamadan və ya çökmədən düzgün surətdə köçürməyə imkan verən üsullar.

Tutaq ki, hər şeyi /source qovluğundan /target qovluğuna köçürməliyik.

Ağla gələn ilk şey:

cp /source/* /target

Gəlin bu əmri dərhal düzəldək:

cp -a /source/* /target

Açar -a bütün atributların, hüquqların surətini əlavə edəcək və rekursiya əlavə edəcək. Hüquqların dəqiq reproduksiyası tələb olunmadıqda, açar kifayətdir -r.

Kopyalamadan sonra, bütün faylların kopyalanmadığını görəcəyik - nöqtə ilə başlayan fayllar:

.profile
.local
.mc

və buna bənzər.

Niyə bu baş verdi?

Çünki joker işarələr qabıq tərəfindən işlənir (bash tipik bir vəziyyətdə). Varsayılan olaraq, bash nöqtələrlə başlayan bütün fayllara məhəl qoymayacaq, çünki onları gizli hesab edir. Bu davranışdan qaçmaq üçün davranışımızı dəyişdirməli olacağıq bash əmrindən istifadə edərək:

shopt -s dotglob

Yenidən başladıqdan sonra bu davranış dəyişikliyinin davam etməsini təmin etmək üçün qovluqda bu əmrlə wildcard.sh faylı yarada bilərsiniz. /etc/profile.d (Ola bilsin ki, paylamanızda fərqli qovluq var).

Mənbə qovluğunda heç bir fayl yoxdursa, o zaman qabıq ulduzun yerinə heç nə əvəz edə bilməyəcək və kopyalama da xəta ilə uğursuz olacaq. Bu vəziyyətə qarşı variantlar var failglob и nullglob. təyin etməmiz lazım olacaq failglob, bu əmrin yerinə yetirilməsinə mane olacaq. nullglob işləməyəcək, çünki uyğunluğu tapmayan joker işarəli sətri boş sətirə (sıfır uzunluq) çevirir. cp xətaya səbəb olacaq.

Bununla belə, qovluqda minlərlə və ya daha çox fayl varsa, joker işarələr yanaşmasından tamamilə imtina edilməlidir. Fakt budur ki bash joker simvolları çox uzun bir əmr xəttinə genişləndirir:

cp -a /souce/a /source/b /source/c …… /target

Komanda xəttinin uzunluğunda bir məhdudiyyət var, biz bunu əmrdən istifadə edərək öyrənə bilərik:

getconf ARG_MAX

Komanda xəttinin maksimum uzunluğunu baytla alaq:

2097152

Или:

xargs --show-limits

Belə bir şey alırıq:

….
Maximum length of command we could actually use: 2089314
….

Beləliklə, gəlin tamamilə joker işarələr olmadan edək.

Sadəcə yazaq

cp -a /source /target

Və burada davranış qeyri-müəyyənliyi ilə qarşılaşırıq cp. Əgər /target qovluğu yoxdursa, onda biz lazım olanı alacağıq.

Bununla belə, əgər hədəf qovluq varsa, o zaman fayllar /target/source qovluğuna kopyalanacaq.

Biz həmişə /target qovluğunu əvvəlcədən silə bilmərik, çünki orada bizə lazım olan fayllar ola bilər və bizim məqsədimiz, məsələn, /target daxilindəki faylları /source faylları ilə əlavə etməkdir.

Mənbə və təyinat qovluqları eyni adlanırsa, məsələn, biz /source-dan /home/source-a kopyalayırdıq, onda biz əmrdən istifadə edə bilərik:

cp -a /source /home

Kopyalandıqdan sonra /home/source-dakı fayllar /source-dan olan fayllarla tamamlanacaq.

Bu məntiqi problemdir: əgər qovluqların adı eynidirsə, təyinat qovluğuna fayllar əlavə edə bilərik, lakin onlar fərqlidirsə, o zaman mənbə qovluğu təyinatın daxilində yerləşdiriləcək. Cp istifadə edərək, joker işarələr olmadan faylları /mənbədən /target-ə necə köçürmək olar?

Bu zərərli məhdudiyyəti aradan qaldırmaq üçün biz qeyri-aşkar bir həlldən istifadə edirik:

cp -a /source/. /target

DOS və Linux ilə tanış olanlar artıq hər şeyi başa düşdülər: hər qovluğun içərisində 2 görünməz qovluq var "." və cari və daha yüksək qovluqlara psevdoqovluq keçidləri olan “..”.

  • Kopyalayarkən cp varlığını yoxlayır və /hədəf/ yaratmağa çalışır.
  • Belə bir kataloq mövcuddur və o /target-dir
  • /mənbədən olan fayllar /target-ə düzgün şəkildə kopyalanır.

Beləliklə, onu qalın çərçivədə yaddaşınıza və ya divara asın:

cp -a /source/. /target

Bu əmrin davranışı aydındır. Bir milyon faylınız olub-olmamasından asılı olmayaraq, hər şey səhvsiz işləyəcək.

Tapıntılar

Kopyalamaq lazımdırsa bütün faylları bir qovluqdan digərinə köçürmək üçün biz joker işarələrdən istifadə etmirik, onların əvəzinə istifadə etmək daha yaxşıdır cp mənbə qovluğunun sonunda nöqtə ilə birləşdirilir. Bu, bütün faylları, o cümlədən gizli olanları kopyalayacaq və milyonlarla faylda və ya heç bir faylda uğursuz olmayacaq.

Sözündən sonra

vmspike oxşar nəticəyə malik komanda versiyasını təklif etdi:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

QEYD: məktub qutusu T mənası var. Əgər qarışdırsanız, tam zibil alacaqsınız: surətin çıxarılması istiqaməti dəyişəcək.
Təşəkkürlər:

  • Şirkətlər RUVDS.COM dəstək və Habré-də bloqunuzda dərc etmək imkanı üçün.
  • Şəkil başına Üçlü Konsepsiya. Şəkil çox böyük və ətraflıdır, ayrıca pəncərədə açmaq olar.

PS Zəhmət olmasa qeyd etdiyiniz səhvləri şəxsi mesajla göndərin. Bunun üçün karmamı artırıram.

cp əmri: *nix-də fayl qovluqlarının düzgün surətdə çıxarılması

Mənbə: www.habr.com

Добавить комментарий