Ders 07 / 20
Oluşturma, Kopyalama ve Taşıma
Dosya oluşturma ve zaman damgası ayarlama, kopyalamanın üstüne yazma davranışı, hedefin dizin olması durumu ve taşımanın dosya sistemi düzeyindeki anlamı.
İçindekiler
Önceki ders ağacı okunabilir kıldı ama veri/ham dizini boştu. Bu ders ağacı doldurur:
ölçüm dosyaları oluşturulur, işlenmiş kopyaları üretilir ve bir yedek dizini kurulur.
Üç komut kullanılacak — touch, cp, mv — ve üçünün de sessizce veri kaybettirdiği
durumlar vardır. Bu durumların hangi kurallardan doğduğu, komutların kendisinden daha
önemlidir.
Dosya Oluşturma ve Zaman Damgaları
touch komutunun asıl işi zaman damgası ayarlamaktır; var olmayan bir dosya adı
verildiğinde onu boş olarak oluşturması ikincil bir davranıştır.
$ touch veri/ham/olcum-01.csv $ ls -l veri/ham total 0 -rw-r--r-- 1 ogrenci ogrenci 0 Jul 26 19:02 olcum-01.csv
Boyut sıfırdır: dosya vardır ama içeriği yoktur. Dosyanın var olması ile içeriğinin olması ayrı şeylerdir; bir dizin girdisi ve bir düğüm oluşturulmuştur, veri bloğu ayrılmamıştır.
İçerik yazmak için çıktı yönlendirme kullanılır:
$ printf 'zaman,sicaklik,nem\n08:00,21.4,55\n12:00,24.9,49\n' > veri/ham/olcum-01.csv $ cat veri/ham/olcum-01.csv zaman,sicaklik,nem 08:00,21.4,55 12:00,24.9,49
> işareti komutun çıktısını terminale değil dosyaya yazdırır. Yönlendirmenin dilbilgisi
Kabuk Programlama kursunun konusudur; burada yalnızca dosya üretmek için kullanılmıştır.
Dikkat edilecek nokta şudur: > hedef dosyayı uyarmadan boşaltır. Var olan bir dosyaya
> ile yazmak, eski içeriği geri alınamaz biçimde siler.
Aynı biçimde iki ölçüm dosyası daha oluşturulur:
$ printf 'zaman,sicaklik,nem\n08:00,19.8,61\n12:00,23.1,52\n' > veri/ham/olcum-02.csv $ printf 'zaman,sicaklik,nem\n08:00,22.6,58\n12:00,26.3,44\n' > veri/ham/olcum-03.csv $ ls -l veri/ham total 12 -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:02 olcum-01.csv -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 olcum-02.csv -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 olcum-03.csv
Var olan bir dosyada touch içeriğe dokunmaz, yalnızca zaman damgalarını o ana ayarlar.
Belirli bir zamana ayarlamak için -t seçeneği kullanılır:
$ touch /tmp/ornek.txt $ ls -l /tmp/ornek.txt -rw-r--r-- 1 ogrenci ogrenci 0 Jul 26 19:03 /tmp/ornek.txt $ touch -t 202603110930 /tmp/ornek.txt $ ls -l /tmp/ornek.txt -rw-r--r-- 1 ogrenci ogrenci 0 Mar 11 09:30 /tmp/ornek.txt
-t değeri YYYYMMDDhhmm biçimindedir ve POSIX’te tanımlıdır. GNU araçlarındaki -d
seçeneği okunabilir tarih dizeleri kabul eder ama taşınabilir değildir; betiklerde -t
tercih edilir.
Zaman damgası ayarlamak yalnızca bir düzen işi değildir: yedekleme ve derleme araçlarının çoğu “kaynak hedeften yeni mi” karşılaştırması yapar ve bu karşılaştırma değişiklik zamanına dayanır.
Kopyalama
cp komutu iki argüman alır: kaynak ve hedef. Hedefin ne olduğuna göre iki farklı kural
işler.
Hedef var olan bir dizinse, kaynak o dizinin içine, aynı adla kopyalanır:
$ cp veri/ham/olcum-01.csv veri/islenmis/ $ ls -l veri/islenmis total 4 -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 olcum-01.csv
Hedef bir dizin değilse, kaynak o adla kopyalanır:
$ cp veri/ham/olcum-01.csv veri/islenmis/ozet-01.csv $ ls -l veri/islenmis total 8 -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 olcum-01.csv -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 ozet-01.csv
Bu iki kural, en sık yapılan hatanın kaynağıdır: hedef dizinin adı yanlış yazılırsa dizin
bulunamaz ve komut, kopyayı o yanlış adla bir dosya olarak oluşturur. Hata iletisi
gelmez. Hedefin sonuna eğik çizgi koymak bu hatayı yakalar: hedefdizin/ yazıldığında ve
böyle bir dizin yoksa komut hata verir.
Üstüne Yazma Sessizdir
cp varsayılan olarak hedefin üzerine sormadan yazar:
$ cat veri/islenmis/ozet-01.csv zaman,sicaklik,nem 08:00,21.4,55 12:00,24.9,49 $ cp veri/ham/olcum-02.csv veri/islenmis/ozet-01.csv $ cat veri/islenmis/ozet-01.csv zaman,sicaklik,nem 08:00,19.8,61 12:00,23.1,52
Eski içerik gitmiştir ve geri getirilemez. Uyarı yoktur, çıkış durumu sıfırdır.
-i seçeneği üstüne yazmadan önce sorar:
$ cp -i veri/ham/olcum-03.csv veri/islenmis/ozet-01.csv cp: overwrite 'veri/islenmis/ozet-01.csv'? n
Olumsuz yanıtta dosya değişmez ve komut sıfırdan farklı bir çıkış durumu döndürür. -i
POSIX’te tanımlıdır ve etkileşimli kullanımda önerilen alışkanlıktır.
Var olan hedefi hiç sormadan koruma seçeneği de vardır, ancak taşınabilir değildir; GNU
araçlarında -n verildiğinde bu seçeneğin davranışının değişebileceğine dair bir uyarı
yazdırılır. Betiklerde hedefin varlığı önce sınanır, seçeneğe güvenilmez.
Dizin Kopyalama
Dizinler varsayılan olarak kopyalanmaz; özyinelemeli kopyalama için -r gerekir.
$ cp -r veri/ham arsiv/ham-yedek $ ls -l arsiv/ham-yedek total 12 -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:04 olcum-01.csv -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:04 olcum-02.csv -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:04 olcum-03.csv
Kopyalar yeni dosyalardır: yeni düğüm, yeni zaman damgası. Zaman damgalarının korunması
isteniyorsa -p eklenir:
$ cp -rp veri/ham arsiv/ham-p $ ls -l arsiv/ham-p total 12 -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:02 olcum-01.csv -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 olcum-02.csv -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 olcum-03.csv
İki listeleme karşılaştırıldığında fark açıktır: -p olmadan tüm dosyalar kopyalama anını
taşır, -p ile özgün zamanlarını korurlar. -p ayrıca izinleri ve sahipliği de
korumaya çalışır. Yedeklemede bu ayrıntı belirleyicidir; zaman damgası kaybolan bir yedek,
“hangi sürüm daha yeni” sorusuna yanıt veremez.
Dizin kopyalamada hedef kuralı bir tuzağa dönüşür:
$ cp -r /tmp/dnm/kaynak /tmp/dnm/hedef $ find /tmp/dnm | sort /tmp/dnm /tmp/dnm/hedef /tmp/dnm/hedef/kaynak /tmp/dnm/hedef/kaynak/a.txt /tmp/dnm/kaynak /tmp/dnm/kaynak/a.txt
Hedef dizin zaten varsa kaynak onun içine yerleşir. Aynı komut ikinci kez
çalıştırıldığında sonuç değişmez, çünkü hedef/kaynak de artık vardır ve içerik üzerine
yazılır. Ancak hedef yokken çalıştırılırsa hedef, kaynağın kopyası olarak oluşturulur. Aynı
komutun iki farklı sonuç vermesi, hedefin önceden var olup olmamasına bağlıdır.
Taşıma
mv yüzeyde kopyalama gibi görünür ama dosya sistemi düzeyinde bambaşka bir işlemdir.
$ ls -li veri/islenmis total 8 22212 -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 olcum-01.csv 22545 -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 ozet-01.csv $ mv veri/islenmis/ozet-01.csv veri/islenmis/gunluk-ozet.csv $ ls -li veri/islenmis total 8 22545 -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 gunluk-ozet.csv 22212 -rw-r--r-- 1 ogrenci ogrenci 47 Jul 26 19:03 olcum-01.csv
Düğüm numarası değişmemiştir: 22545 hem eski hem yeni adda aynıdır. Değişen tek şey
dizin girdisidir. Ad, dosyanın bir özelliği değil, dizinde tutulan bir eşlemedir; adı
değiştirmek dosyaya dokunmaz.
Bunun ölçülebilir sonucu şudur: aynı dosya sistemi içinde taşıma, dosya boyutundan bağımsız olarak sabit maliyetlidir. Bir baytlık dosya ile bir gigabaytlık dosyayı yeniden adlandırmak aynı süreyi alır, çünkü hiçbir veri okunmaz veya yazılmaz.
Aynı işlem farklı dosya sistemleri arasında yapıldığında bu geçerli değildir. Düğüm
numaraları yalnızca kendi dosya sistemi içinde anlamlıdır; bir aygıttan diğerine girdi
taşınamaz. Bu durumda mv içeriği kopyalar ve kaynağı siler — süre dosya boyutuyla
orantılıdır ve işlem yarıda kesilirse hedef eksik kalabilir.
Hedef bir dizinse mv de aynı adlandırma kuralını izler:
$ mv veri/islenmis/olcum-01.csv belge/ $ ls belge olcum-01.csv $ ls veri/islenmis gunluk-ozet.csv
mv de üstüne sessizce yazar ve -i seçeneğiyle sorması sağlanır. Kopyalamadan farklı
olarak burada iki dosya birden kaybedilir: hedefin eski içeriği silinir ve kaynak da
ortadan kalkar.
Özet
touchzaman damgası ayarlar; var olmayan dosyayı boş olarak oluşturması ikincil bir davranıştır ve-tile belirli bir zaman verilebilir.- Kopyalamada hedef var olan bir dizinse kaynak aynı adla içine, değilse verilen adla kopyalanır; yanlış yazılmış dizin adı sessizce bir dosya oluşturur.
cpvemvhedefin üzerine sormadan yazar;-isormayı sağlar.- Dizin kopyalama
-rister;-pzaman damgalarını, izinleri ve sahipliği korur. - Aynı dosya sistemi içinde taşıma yalnızca dizin girdisini değiştirir: düğüm numarası korunur ve maliyet dosya boyutundan bağımsızdır.
- Farklı dosya sistemleri arasında taşıma kopyala-ve-sil işlemine dönüşür; maliyet boyutla orantılıdır ve yarıda kesilme riski taşır.
Sonraki Adım
Bu dersin üç komutu da veri kaybettirebilir, ama hepsi bir şeyin üzerine yazarak yapar. Silme komutu ise doğrudan yok eder ve dosya sisteminde bir “geri al” işlemi yoktur. Sonraki ders silmenin çekirdek düzeyinde ne anlama geldiğini, hangi durumda silinen bir dosyanın hâlâ yaşadığını ve yıkıcı komutları çalıştırmadan önce doğrulamanın nasıl alışkanlık hâline getirileceğini ele alır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.