forked from nyucel/linuxessentials
-
Notifications
You must be signed in to change notification settings - Fork 2
/
bolum6.tex
931 lines (752 loc) · 66.6 KB
/
bolum6.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
\chapter{Dosyalar: Bakım ve Besleme}
\label{chap:bolum6}
\paragraph{Amaçlar}
\begin{itemize}
\item Linux kurallarıyla birlikte dosya ve dizin isimleriyle uğraşmaya alışmak
\item Dosya ve dizinlerle çalışmada önemli komutları bilmek
\item Kabuk dosya adı arama şablonlarını kullanabilmek
\end{itemize}
\paragraph{Önceden Bilinmesi Gerekenler}
\begin{itemize}
\item Kabuk kullanımı
\item Metin editörü kullanımı
\end{itemize}
\begin{section}{Dosya ve Yol İsimleri}
\begin{subsection}{Dosya İsimleri}
Linux gibi işletim sisteminin en önemli hizmetlerinden birisi de, veriyi sabit disk veya USB sürücüler gibi kalıcı hafızaya depolamak ve sonrasında onları kullanmaktır. Bu işi insan açısından katlanılabilir kılmak için, benzer veriler cihaz üzerinde "dosyalar" altında toplanır.
Eğer bu bile sizin için önemsiz gözüküyorsa, bu anlatılanların size hiçbir getirisi yoktur. Eskiden bazı işletim sistemleri, bir verinin bilgisini almak için disk üzerindeki iz sayıları gibi ayrıntıları belirtmeyi zorunlu kılıyordu.
Bu yüzden, size dosyalarla nasıl uğraşılacağını anlatmaktan önce, Linux'un dosyaları nasıl isimlendirdiğini açıklamalıyız.
Linux dosya isimlerinde, aslında bilgisayarınızın gösterebileceği her karakteri (hatta daha fazlasını) kullanmanıza olanak tanır. Ancak, karakterlerden bazılarının özel anlam içerdiğinden beri, dosya isimlerinde bu karakterleri kullanmanızı tavsiye ederiz. Yalnızca iki karakterin kullanılamaz: bölü ("/") işareti ve 0 byte (ASCII değeri 0 olan karakter). Boşluk, inceltme işareti ya da dolar işaretleri gibi karakterler serbestçe kullanılabilir, fakat kabuk tarafından yanlış yorumlanmakyan kaçınmak için komut satırında "$\backslash$" veya tırnak işaretleri kullanılarak bu karakterlerden kaçılır.
Acemilerin kolayca tuzağa düşeceği olay ise, Linux'un dosya isimlerinde büyük/küçük harfleri ayırt edebilmesidir. Büyük ve küçük harfli dosyaların ayrı gösterildiği fakat aynı davranıldığı Windows işletim sisteminin tersine Linux \emph{x-files} ve \emph{X-Files} dosya isimlerini iki farklı dosya olarak ele alır.
Limitlerin "dosya sistemine" bağlı olduğundan beri, Linux altında byte'lar halinde düzenlenen dosya adları "çok uzun", belli bir üst limit yoktur, olabilir( Linux'ta bu düzenlemeyle ilgili birçok yöntem vardır). Normal sınır 255 karakterdir, fakat 3 satırdan daha fazla uzunlukta dosya isimleri standart metin terminalinde size bir karmaşıklık oluşturmamalıdır.
DOS ve Windows bilgisayarlardan başka bir fark da Linux, dosyanın tipini belirlemek için sonekleri kullanmaz. Bu yüzden, dosya ismindeki nokta tamamen sıradan bir karakterdir. Bir metin dosyasını \emph{mumble.txt} olarak kaydetmede serbestsiniz, fakat prensip olarak sadece \emph{mumble} kelimesi de kabul edilebilir. Bu kullanım tabi ki sizin tamamen uzantı ile adlandırmanızı engellememelidir, sonuçta bu kullanım dosya içeriğini tanımlamanızda kolaylık sağlar.
Bazı programlar girdi dosyalarında özel uzantı kullanmayı zorunlu kılar. Örneğin C derleyicisi olan \emph{gcc}, "\emph{.c}" ile biten C kaynak kodu, "\emph{.s}" ile biten makine dili kaynak kodu ve "\emph{.o}" ile biten ön derlenmiş nesne dosyaları isimlerini dikkate alır.
Dosya isimlendirmede özgürce inceltme işareti ve diğer özel karakterleri kullanabilirsiniz. Yine de, eğer dosyalar diğer sistemlerde kullanılacaksa özel karakterleri kullanımından kaçmak en iyisidir, çünkü diğerlerinde dosyaların aynı isimle gösterileceğinin bir garantisi yoktur.
Özel karakterlerin ne olduğu sizin yerel ayarlarınıza bağlıdır, çünkü ASCII karakter setini (Çoğunlukla içinde İngilizce dili, rakamlar ve yaygın özel karakterlerin bulunduğu 128 karakter) aşan karakterlerin temsili için genel bir standart yoktur. Çokça kullanılan kodlamalara örnek olarak ISO 8859-1 ve ISO 8859-15 (sırasıyla ISO-Latin-1 ve ISO-Latin-9 olarak bilinir) bununla birlikte gelişigüzel ve çok doğru olmayarak adına "Unicode" denilen genellikle "UTF-8" karakter seti ile kodlanan ISO 10646. Y kodlaması sistemde yürürlükte iken dizine baktığınız zaman X kodlamasıyla oluşturduğunuz dosyalar tamamen farklı gözükebilir. Bu konuların üzerinde çok durursanız, size tüm konu hiçbir şey gibi gelir.
Bazen kendinizi yanlış karakter setiyle kodlanmış bir yığın dosya ile uğraşıyor olarak bulabilirsiniz. Çeşitli karakter setleri arasında dönüşüm yapabilen \emph{convmv} programı bu konuda size yardım edebilir. (Çoğu dağıtımın standart kurulumunun bir parçası olmadığından, muhtemelen kendiniz yüklemeniz gerekecektir.) Ancak, bunu tüm bölümü bitirdiğimiz zaman yapmanız daha uygun olur, çünkü daha normal \emph{mv}'den bahsetmedik bile\ldots
Aşağıdaki tüm karakterleri dosya isimlendirmelerinde özgürce kullanabilirsiniz:
\begin{verbatim}
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
0123456789+-._
\end{verbatim}
Ancak aşağıdaki ipuçlarına dikkat etmelisiniz:
\begin{itemize}
\item Linux ve daha eski Unix sistemleri arasında dosya taşımalarını mümkün kılmak için dosya isimleri en fazla 14 karakter olmalıdır. (Bu kurala uymak gerçekten önemlidir.)
\item Dosya isimleri her zaman harf veya rakamlardan biriyle başlamalıdır; diğer 4 karakterleri sadece dosya içerisinde sorunsuzca kullanabilirsiniz.
\end{itemize}
Bu kuralları anlamanın en kolayı birkaç örneği incelemektir. Uygun dosya isimlerine örnek olarak
\footnotesize
\begin{verbatim}
X-files
foo.txt.bak
50.something
7_of_9
\end{verbatim}
\normalsize
verilebilir. Buna karşılık aşağıdaki kullanımlar problem oluşturabilir (muhtemelen):
\footnotesize
\begin{verbatim}
-10F ‘‘- ’’ ile başlıyor, özel karakter var
.profile Gizli dosya olacaktır
3/4-metre Kural dışı karakter içerir
Smörrebröd İnceltme işareti içerir
\end{verbatim}
\normalsize
Diğer bir tuhaf özellik de, dosya isimlerinin nokta (".") ile başlaması bazı yerlerde dosyanın gözden kaçmasına neden olacak, örneğin dizin içerisindeki dosyaların listelendiği zaman, bu tür dosya isimleri "gizli" gibi düşünülür. Bu özellik genellikle programların içerik ayarlarında ve dizin listelemelerde çok daha önemli dosyaların kullanıcının kafasını karıştırmamak amacıyla kullanılır.
DOS ve Windows uzmanları için: Bu sistemler dosyanın isminden bağımsız olarak "dosya özniteliklerinin" "gizli" olması ile izin verir. Linux ve Unix böylesi bir işi desteklemez.
\end{subsection}
\begin{subsection}{Dizinler}
Potansiyel olarak birçok kullanıcı aynı Linux sisteminde alıştığından, tüm dosya isimlerinin sadece bir tane olması problem teşkil edebilirdi. Sue kullanıcısı halihazırda aynı isimde bir dosyaya sahip olduğu için Joe kullanıcısının \emph{letter.txt} isimli bir dosya oluşturmasını oldukça güç hale sokar. Ayrıca Joe'nun, Sue'nun tüm dosyalarını okuyamamasını garanti eden uygun bir yol bulunması gerekir.
Bu nedenle, Linux dosyaları gruplamak için aşamalı "dizin" fikrine destek verir. Aynı dizindeki dosyalar dışında, dosya isimlerinin tüm sistemde eşsiz olması gerekmez. Özellikle bu, sistemin Joe ve Sue için farklı dizinler atayabilmesini, ve her birinin kendi dosyaları hakkında diğerlerininkilerin isimlerini dert etmeden çağırabilmeleri anlamına gelir.
Ek olarak, Joe'ya Sue'nun \emph{dizinine} (veya tam tersi) erişmesini yasaklayabiliriz ve dizin içerisindeki kişisel dosyalar hakkında endişelenmemize gerek kalmaz.
Linux'ta dizinler basit dosyalar olsa da, "düz" dosyalara erişmek için kullandığınız yöntemler ile onlara erişemeyebilirsiniz. Ancak, daha önce bahsettiğimiz dosya isimleri kurallarını(önceki bölüme bakınız) dizin isimlendirmelerinde de göz önünde bulundurmanız gerekir. Sadece bölü ("/") karakterinin, dizin isimlerinden dosya isimlerini ve dizinleri birbirlerinden ayrımak için kullanıldığını bilmeniz yeterlidir. Örnek olarak: \emph{joe/letter.txt}, \emph{joe} dizinindeki \emph{letter.txt} dosyasıdır.
Dizinler ağaç-benzeri (yaratıcı bir şekilde "dizin ağacı" denen) yapı ile tasvir edilen diğer dizinleri içerebilir (bu "aşamalı" teriminden daha önce de bahsetmiştik). Bir Linux sistemi, ağacın kökleri gibi bir yapıda olan "kök dizini" denilen özel bir dizin içerir. "/"(bölü) ile ifade edilir.
İsminin aksine, kök dizininin, sistem yöneticisi anlamına gelen \emph{root} ile alakası yoktur. Sadece isimleri benzerdir.
Burada bölünün çift görevi vardır, hem kök dizininin adıdır, hem de dizin isimleri arasında ayraç görevi üstlenir. Bu konuya birazdan geri döneceğiz.
Yaygın Linux dağıtımlarındaki temel yükleme, genellikle tek bir dosya hiyerarşisinde bulunan ve bunun çokça belirli düzene göre yapılandırılmış olduğu onbinlerce dosyayı içerir. Bu dosya hiyerarşisine Bölüm ~\ref{chap:bolum10}'da daha çok yer vereceğiz.
\end{subsection}
\begin{subsection}{Mutlak ve Göreceli Yol İsimleri}
Linux sistemindeki her dosya, kök dizini tarafından başlayan, bir dosyaya (dosyanın kendisine) ulaşıncaya kadar devam eden tüm dizinlerin adının geçtiği ve sonunda dosyanın kendisinin bulunduğu dosya isimleriyle tasvir edilir. Örneğin, \emph{/home/joe/letter.txt} ismi, \emph{joe} dizini altında bulunan, \emph{home} dizini içerisinde konumlanan, daha sonra da evebeyn olan kök dizininin yer aldığı \emph{letter.txt} dosyasına karşılık gelir. Kök dizini ile başlayan isimlere "mutlak yol ismi" adı verilir. İsimler dizin ağacı içerisinde dizin ve dosya isimleri barındıran "yol" vasıtasıyla tanımlandığından "yol isimleri" lafını kullanırız.
Linux sisteminde her sürecin bir "mevcut dizini" (genellikle "çalışma dizini" diye adlandırılır) vardır. Dosya isimleri bu dizinin içerisinde aranır; \emph{letter.txt} "mevcut dizin içerisindeki letter.txt" için, \emph{sue/letter.txt} "sue dizini içerisindeki, letter.txt" için bir kısaltmadır. Mevcut dizinden başlayan bu tarz isimlere "göreceli yol isimleri" adı verilir.
Göreceli yol isimlerinin mutlak olduğunu söylemek önemsizdir: Mutlak dosya yolu bir "/" ile başlar; diğer hepsi görecelidir.
Mevcut dizin evebeyn ve çocuk süreçler arasındaki "miras" olarak aktarılır. Yani kabuktan yeni bir kabuk başlattığınızda(veya başka bir program), bu yeni kabuk, sizin başlatmak için kullandığınız kabuk dizini ile aynı mevcut yolu kullanır. Yeni kabuğunuzda diğer dizine \emph{cd} komutunu kullanarak geçebilirsiniz, fakat eski kabuğun mevcut dizini değişmez. Eğer yeni kabuktan ayrılırsanız, eski kabuğun mevcut dizinine (değişmemiş dizine) geri dönersiniz.
Göreli yol isimlerinde(hatta mutlak olanlarda bile) iki kullanışlı kestirme vardır: ".." ismi her zaman dizin ağacında bir bilinmeyen olan mevcut dizinin üst dizinini işaret eder. Örneğin, \emph{/home/joe}, \emph{/home} durumudur. Bu sıklıkla mutlak yol ismine başvurmak zorunda kalmadan, mevcut dizinden, dizin ağacı gibi gösterilen "yan dal"'a ayrılmak için kullanışlı bir yoldur. Farzedelim ki \emph{/home/joe} dizininin \emph{letters} ve \emph{novels} isminde altdizinleri olsun. \emph{letters} sizin mevcut dizininiz gibi olsun, \emph{novels} dizininin içerisinde \emph{ivanhoe.txt} dosyasına kaba bir şekilde mutlak yol ismi olan \emph{/home/joe/novels/ivanhoe.txt}'yi kullanmaksızın \emph{../novels/ivanhoe.txt} şeklinde göreceli yol ismi belirterek referans belirtebilirsiniz.
İkinci kestirme ise size açıkça bir anlam ifade etmiyor gibi gelebilir: "." ismi dizin içerisinde bulunur ve her zaman dizinin kendisini ifade eder. Neden zaten içinde bulunduğumuz dizine işaret eden böyle bir metoda ihtiyacımızın olduğunun doğrudan bir cevabı yoktur, fakat tabi ki bu durumların bize kattığı kullanışlı beceriler vardır. Örneğin, belki biliyorsunuzdur (ya da Bölüm ~\ref{chap:bolum9}'a bakınız) kabuğun harici komutlar için program dosyalarını ararken kullandığı çevresel dizin değişkeni olan \emph{PATH} vardır. Diyelim ki bir yazılım geliştiricisisiniz, bir program çalıştırmak istiyorsunuz, \emph{prog} olarak isimlendirdiğimiz, (a) mevcut dizininiz içerisindeki bulunan ve (b) \emph{PATH} içerisinde yer almayan (Güvenlik nedenleri için her zaman iyi bir fikirdir) dizininiz içerisindeki \emph{prog}'u çalıştıralım, halâ kabuğunuzdayken
\footnotesize
\begin{verbatim}
$ ./prog
\end{verbatim}
\normalsize
diyerek dosyanızı, mutlak yol ismini vermek zorunda kalmadan program olarak başlatabilirsiniz.
Linux kullanıcısı olarak sisteme girdiğinizden hemen sonra "ev dizinine" ulaşırsınız. Sistem yöneticisi sizin hesabınızı oluşturduğunda bu dizinin ismine karar verir, fakat genellikle kullanıcı isminizle aynı olur ve /home dizini altında yer alır, \emph{joe} kullanıcısı için atanan \emph{/home/joe} gibi.
\end{subsection}
\end{section}
\begin{section}{Dizin Komutları}
\begin{subsection}{Mevcut Dizin: cd \& Co.}
Mevcut dizini değiştirmek için \emph{cd} kabuk komutunu kullanabilirsiniz: Basitçe parametre olarak arzu edilen dizin ismi verilir:
\footnotesize
\begin{verbatim}
$ cd letters letters dizinine değiştirir
$ cd .. Bir üstteki dizine değiştirir
\end{verbatim}
\normalsize
Eğer parametresiz kullanacak olursanız ev dizininize erişirsiniz:
\footnotesize
\begin{verbatim}
$ cd
$ pwd
/home/joe
\end{verbatim}
\normalsize
Mevcut dizinin mutlak yolunun çıktısını almak için \emph{pwd} ("print working directory") komutunu kullanabilirsiniz.
Ayrıca mevcut dizininizi büyük olasılıkla kendi istemcinizin bir kısmı olarak görebilirsiniz. Sistem ayarlarınıza bağlı olarak
\footnotesize
\begin{verbatim}
joe@red:~/letters> _
\end{verbatim}
\normalsize
gibi bir satırla karşılaşabilirsiniz. \emph{$\sim$/letters} \emph{/home/joe/letters} ifadesi için kısaltmadır; tilda ("\emph{$\sim$}") ise mevcut kullanıcı ev dizininizi gösterir.
"\emph{cd -}" komutu \emph{cd} komutu ile son kullanılmış dizine tekrar geri dönmeyi sağlar. Bu kullanışlı komut iki dizin arasında peş peşe geçiş yapmayı sağlar.
\paragraph{{\Huge{\PencilLeftDown}}Alıştırmalar}{
\begin{enumerate}
\item Kabukta \emph{cd} komutu dahili mi, harici mi komuttur? Neden?
\item Kabuk kılavuz dosyasında \emph{pushd}, \emph{popd}, \emph{dirs} komutlarını okuyunuz. Bu komutların tasvir edildiği gibi çalıştığına ikna olunuz.
\end{enumerate}}
\paragraph{}{
\begin {table}[H]
\caption {ls'deki bazı dosya gösterimleri} \label{tab:tablo61}
\begin{tabular}{l c c c}
\hline
Dosya Tipi & Renk & Sonek (ls -F) & Harf türü (ls -l) \\
\hline
düz metin & siyah & none & - \\
çalıştırılabilir dosya & yeşil & * & - \\
dizin & mavi & / & d \\
link & cyan & @ & l \\
\hline
\end{tabular}
\end {table}
}
\paragraph{}{
\begin {table}[H]
\caption {Bazı ls parametreleri} \label{tab:tablo62}
\begin{tabular}{l l}
\hline
Parametre & Sonuç \\
\hline
-a veya --all & Aynı zamanda gizli dosyaları da görüntüler \\
-i veya --inode & Eşsiz dosya numarasını görüntüler (inode number) \\
-l veya --format=long & Ek bilgi görüntüler \\
-o veya --no-color & Çıktı renk-kodlamasını atlar \\
-p veya -F & Eklenen özel karakterle dosya türünü işaretler \\
-r veya --reverse & Sıralamayı ters yapar \\
-R veya --recursive & Alt dizinlerle birlikte öz yinelemeli olarak listeler (DOS: DIR/S) \\
-S veya --sort=size & Boyuta göre sıralar (büyükten küçüğe doğru) \\
-t veya --sort=time & Değiştirilme tarihine göre sıralar (yeniden eskiye doğru) \\
-X veya --sort=extension & Dosya uzantısına göre sıralar (“dosya türüne” göre) \\
\hline
\end{tabular}
\end {table}
}
\end{subsection}
\begin{subsection}{Dosya ve Dizinleri listeleme --ls}
Dizin ağacı etrafında yolunuzu bulmak için hangi dosya ve dizinlerin mevcut dizin içerisinde olduğunu bilmeniz gerekir. \emph{ls}("list") komutu tam da bu iş için vardır.
Parametresiz kullanımda dosyaların isme göre sıralandığı çok sütunlu çıktı gösterilir. Renkli ekranların günümüzde standart haline gelmesiyle, dosya isimleri ve türlerinin farklı renklerde görüntülenmesi gelenek haline geldi (Daha dosya tipleri hakkında henüz konuşmadık; bu konuya Bölüm ~\ref{chap:bolum10}'da değineceğiz).
Neyse ki, günümüzde birçok dağıtım renkli kullanımı bünyesinde barındırıyor. Tablo ~\ref{tab:tablo61}'de en yaygın gösterimler vardır.
Siyah-Beyaz ekranlarda, ki hala günümüzde var, -F veya -p parametreleri önerilir. Bunlar dosya türleri ile ilişkili dosya isimlerine özel karakter eklerler. Bu karakterlerin bazılarına Tablo ~\ref{tab:tablo61}'de değinmiştik.
Gizli dosyaları (nokta ile başlayan isimlileri) \emph{-a} ("all") parametresiyle görüntüleyebilirsiniz. Bir başka kullanışlı seçenek ise \emph{-l}'dir(küçük harf olarak "L", "long"(uzun) anlamı taşır, "1" rakamı değildir). Bu sadece dosya isimlerini sıralamakla kalmaz ayrıca her dosya için ek bilgi de içerir.
Bazı Linux dağıtımlarında önceden ayarlanmış bazı yardımcı parametrelerin kombinasyonu olan kısaltmalar vardır; SUSE dağıtımlarında, örneğin sadece basit bir \emph{l} kullanımı "\emph{ls -alF}"'nin kısaltmasıdır. "\emph{ll}" ve "\emph{la}" \emph{ls}'nin farklılaşmış bazı kısaltmalarıdır.
Aşağıdaki örnekte \emph{ls}'nin \emph{-l}'li ve \emph{-l}'siz kullanımı vardır:
\footnotesize
\begin{verbatim}
$ ls
file.txt
file2.dat
$ ls -l
-rw-r--r-- 1 joe users 4711 Oct 4 11:11 file.txt
-rw-r--r-- 1 joe users 333 Oct 2 13:21 file2.dat
\end{verbatim}
\normalsize
İlk durumda, bütün gizli olmayan dosyalar listelendi; ikinci durumda ise ek bilgiler eklendi.
Uzun formatın farklı parçalarının anlamları vardır: İlk karakter dosya türünü verir (Bölüm ~\ref{chap:bolum10}'a bakınız); sade dosyalar "-", dizinler "d" şeklinde vb.(Tablo ~\ref{tab:tablo61}'deki "karakter türleri").
Sonraki 9 karakter erişim izinlerini gösterir. Sonraki dosyanın adedini, dosyanın sahibini(joe), ve dosyanın grubunu(users) gösterir. Byte olarak dosyanın boyutundan sonra, dosyanın içerdiği son değiştirilme bilgisini tarih ve saat olarak görebilirsiniz. Ve tabi ki dosyanın adı da görüntülenir.
Kullandığınız dile bağlı olarak özellikle tarih ve saat sütunları örmeklerimizden(asgari dil ortamı "C" kullanarak oluşturduğumuz) tamamen farklı görünebilir. Bu genellikle interaktif kullanımda sorun çıkarmaz, fakat eğer kabuk betiğinizin bir bölümünde "ls -l"'nin çıktısını almaya çalışıyorsanız büyük bir sıkıntı ortaya çıkabilir. (Gelişmiş Linux kılavuzunu çalışmaktan önce, kabuk betiklerinde ön tanımlanmış dil çevreselini kullanmanızı öneririz.)
Eğer dizin için ekstra bilgi görmek isterseniz(/tmp dizini gibi), "ls -l /tmp"'nin size gerçekten bir yardımı dokunmaz, çünkü ls /tmp içerisindeki tüm dosyaların verisini listeleyecektir. -d parametresi kullanarak /tmp'nin kendisinin bilgisini elde edebilirsiniz.
ls burada bahsedilenlerden çok daha fazlasına destek verir; önemli olanlarından bir kaçı Tablo ~\ref{tab:tablo62}'de gösterilmişti.
Linux Essentials ve LPI-101 gibi LPI sınavlarında, kimse sizden ls'nin tüm 57 tane parametresini bilmenizi beklemez. Ancak en önemli yarım düzine kadarını—yaklaşık Tablo ~\ref{tab:tablo62} içeriğindeki kadarını— ezberlemek isteyebilirsiniz.
\paragraph{{\Huge{\PencilLeftDown}}Alıştırmalar}{
\begin{enumerate}
\item \emph{/boot} dizinini hangi dosyaları içerir? Alt dizinleri var mıdır? Varsa hangileridir?
\item Dosya ismini parametre olarak alan \emph{ls} ile dizin ismini parametre olarak alan \emph{ls} arasındaki fark nedir?
\item Eğer dizin adı programda geçiyorsa, dizindeki dosyaların bilgisini görüntülemektense \emph{ls}'yi sadece dizinleri göstermesi için hangi parametre ile çalıştırırız? (İpucu:Belgeye bakınız.)
\end{enumerate}}
\end{subsection}
\begin{subsection}{Dizin Oluşturma ve Silme: mkdir ve rmdir}
Dosyalarınızı düzenli bir şekilde tutmak istediğinizde yeni dizinler oluşturmak iyi bir fikirdir. Dosyalarınızı ilişkili konuya göre (örnek olarak) bu "klasörler" altında toplayabilirsiniz. Tabi ki ileri bir yapılandırma için, bu dizinler altında ilave dizinler oluşturabilirsiniz, hevesinizi, keyfi engeller tarafında sınırlamayınız.
Yeni dizinler oluşturmak için |emph{mkdir} komutu kullanılabilir. Bağımsız değişlen olarak bir veya daha çok dizin ismi alır, aksi halde yeni dizin oluşturmak yerine sadece bir hata mesajı alırsınız. İç içe dizinleri tek adımda oluşturabilmek için \emph{-p} parametresini kullanabilirsiniz, aksi halde komut, oluşturduğunuz yoldaki dizinlerin hepsini sonuncusu hariç varmış gibi farzedecektir. Örneğin:
\footnotesize
\begin{verbatim}
$ mkdir pictures/holiday
mkdir: cannot create directory `pictures/holiday': \\
No such file or directory
$ mkdir -p pictures/holiday
$ cd pictures
$ ls -F
holiday/
\end{verbatim}
\normalsize
Bazen bir dizine artık ihtiyaç duyulmaz. Dağınıklığı azaltmak için \emph{rmdir} ("remove directory") komutu ile o dizini silebilirsiniz.
\emph{mkdir} komutunda olduğu gibi en az bir silinecek dizin adı verilmelidir. Ayrıca silinecek dizinler boş olmalı, içerlerinde dosya veya dizinler barındırmamalıdır. Diğer komutta olduğu gibi bunda da her ismin sonundaki son dizin siliniz.
\footnotesize
\begin{verbatim}
$ rmdir pictures/holiday
$ ls -F
pictures/
\end{verbatim}
\normalsize
\emph{-p} seçeneği ile en sağdakinden başlayarak boş olan tüm dizinler tek bir hamle ile silinebilir.
\footnotesize
\begin{verbatim}
$ mkdir -p pictures/holiday/summer
$ rmdir pictures/holiday/summer
$ ls -F pictures
pictures/holiday/
$ rmdir -p pictures/holiday
$ ls -F pictures
ls: pictures: No such file or directory
\end{verbatim}
\normalsize
\paragraph{{\Huge{\PencilLeftDown}}Alıştırmalar}{
\begin{enumerate}
\item Ev dizininiz içerisinde \emph{dir1}, \emph{dir2} ve \emph{dir3} isimli dizinleri içeren \emph{grd1- test} isimli bir dizin oluşturun. \emph{grd1- test/dir1} içerisine geçerek "hello" yazan \emph{hello} isimli bir dosya (örneğin metin düzenleyici ile) oluşturun. \emph{grd1- test/dir2} içerisinde "howdy" yazan \emph{howdy} isimli bir dosya oluşturun. Bu dosyaların olmadığını kontrol edin. \emph{dir3} isimli dizini \emph{rmdir} komutu ile silin. Daha sonra \emph{dir2} isimli dizini \emph{rmdir} kullanarak silmeye çalışın. Ne oldu ve neden?
\end{enumerate}}
\end{subsection}
\end{section}
\begin{section}{Dosya Arama Şablonları}
\label{sec:bolum63}
\begin{subsection}{Basit Arama Şablonları}
Sık sık birden çok dosyaya aynı anda bir komutu uygulamak istersiniz. Örneğin, eğer "p" ile başlayıp ".c" ile biten tüm dosyaları \emph{prog1} dizininden \emph{prog2} dizinine kopyalamak istediğinizde, her dosyanın ismini açık bir şekilde yazmak, eğer en azından birçok dosya ile uğraşıyorsanız, oldukça sıkıcı olabilir. Kabuk arama şablonları kullanarak bu iş çok rahat bir şekilde yapılır.
Kabuk komut satırında belirlediğiniz bir kelimeyi yıldız ile kullanarak bunu sağlayabilirsiniz. Örneğin:
\footnotesize
\begin{verbatim}
prog1/p*.c
\end{verbatim}
\normalsize
Kabuk bu bağımsız değişkeni asıl program içerisinde bağımsız değişken ile eşleşen dosya adlarının sıralı bir listesi ile değiştirir. "Eşleşme", asıl dosya adında, yıldız yerine keyfi karakterlerin istenen uzunlukta sıralanmasına denir. Örneğin:
\footnotesize
\begin{verbatim}
prog1/p1.c
prog1/polly.c
prog1/pop-rock.c
prog1/p.c
\end{verbatim}
\normalsize
yukarıdaki isimler uygundur (örnekteki son ismin özelliği için kısa not — "istenen uzunluk", "sıfır uzunluğu" içerebilir!). Yıldız ile eşleştirilemeyecek bir karakter sizce ne olabilir?—taksim işareti; genellikle arama şablonundaki yıldız karakterini bulunduğunuz dizin ile sınırlamak daha iyidir.
\emph{echo} komutunu ile kolay bir şekilde bu arama şablonlarını test edebilirsiniz.
\footnotesize
\begin{verbatim}
$ echo prog1/p*.c
\end{verbatim}
\normalsize
komutu herhangi bir zorunluluk, kural vb. olmaksızın eşleşen dosya isimlerini çıktı olarak verir.
Eğer gerçekten \emph{dizin ağacında} belirli bir dizin ile başlayan tüm dosyalara bir komut uygulamak isterseniz, bunun için yapılacak bir çok yöntem vardır. Bu konuya ~\ref{sec:bolum644}'te değineceğiz.
"*" arama şablonu "mevcut dizindeki tüm dosyaları" tanımlar, nokta ile başlayan gizli dosyalar hariç. Olası zahmetli sürprizleri engellemek için, şayet açıkça ".*" gibi anlam içeren dosyaları aramıyorsanız, arama şablonları gizli dosyaları göz ardı ederek çalışır.
DOS veya Windows\footnote{Muhtemelen CP/M için çok gençsinizdir.} gibi işletim sistemlerinin komut satırında yıldız kullanımı ile rastgelmiş ve "*.*" kullanarak dizindeki tüm dosyalara işaret etmiş olabilirsiniz. Linux altında bu doğru değildir, "*.*" şablonu "nokta içeren tüm dosyalar" ile eşleşir, fakat nokta zorunlu değildir. Linux'taki karşılığı dediğimiz gibi "*"'dır.
Soru işareti arama şablonu sadece tek bir keyfi karakter ile eşleştirmek için kullanılır (yine taksim işareti hariç).
Örnekteki gibi bir kalıp
\footnotesize
\begin{verbatim}
p?.c
\end{verbatim}
\normalsize
alttaki isimleri eşler:
\footnotesize
\begin{verbatim}
p1.c
pa.c
p-.c
p..c
\end{verbatim}
\normalsize
Unutmayın mutlaka bir karakter bulunmalıdır, "hiçbir şey" seçeneği burada geçerli değildir.
Özellikle çok önemli bir olaya dikkat etmelisiniz: Arama şablonunun genişlemesi kabuğun sorumluluğu altındadır! Çalıştırdığınız komutlar genellikle arama şablonları hakkında birşey bilmez ve ilgilenmezler de. Onlar yol isimlerini listeleyerek bakmaya başlar, fakat nereden geldikleri ile ilgilenmezler, örneğin, doğrudan mı yazılmış ya da bir arama sonucu mu diye kontrol etmezler.
Bu arada, kimse arama şablonlarının sonuçlarının yol isimleri kadar yorumlanabilir olduğunu söylemez. Örneğin, eğer bir dizin içerisinde "-l" isminde dosya içeriyorsa, "ls *"'nin o dizinde kullanılması size ilginç ve belki de sürpriz bir sonuç verecektir. (bkz: Alıştırma 6.9)
Eğer kabuk, arama şablonlarıyla eşleşen isimlerde dosyaları bulamazsa ne olur? Bu durumda söz konusu komut, arama şablonunu pas geçer; kendi arma işi ne ise onu yapar. Genellikle bu tarz arama şablonları dosya isimleri gibi yorumlanmışlardır, fakat söz konusu "dosya" ise bulunamaz ve hata mesajı bildirilir. Ancak, arama şablonları ile kullanışlı işler yapabileceğiniz birçok komut vardır, bütün bunlarla, gerçekten meydan okuyabileceksiniz, kabuğun çalıştırdığı komut, kendi genişlemesini engel olmaz. (İpucu:tırnak işaretleri).
\end{subsection}
\begin{subsection}{Karakter Sınıfları}
Arama şablonlarında eşleştirilen karakterlerin daha hassas tanımlanması için "karakter sınıfları" önerilir: Aşağıdaki biçimdeki bir arama şablonunda
\footnotesize
\begin{verbatim}
prog[123].c
\end{verbatim}
\normalsize
köşeli parantez içindeki karakterler, içerisinde tam olarak o karakter geçen isimlerle eşleşir. Bu sebeple örnekteki şablon
\footnotesize
\begin{verbatim}
prog1.c
prog2.c
prog3.c
\end{verbatim}
\normalsize
ile eşleşir, fakat bunlar ile değil
\footnotesize
\begin{verbatim}
prog.c Tam olarak bir karakter gerekli
prog4.c 4 sıralandırmada yok
proga.c a harfi de olmaz
prog12.c Tam olarak bir karakter, lütfen
\end{verbatim}
\normalsize
Daha kullanışlı bir gösterimle özel aralıkları belirleyebilirsiniz.
\footnotesize
\begin{verbatim}
prog[1-9].c
[A-Z]bracadabra.txt
\end{verbatim}
\normalsize
İlk satırdaki köşeli parantezdekiler tüm rakamlarla, 2. satırdaki de büyük harfle başlayanlarla eşleşir.
Yaygın karakter kodlamalarında harflerin bitişik olmadığını unutmayın:
\footnotesize
\begin{verbatim}
prog[A-z].c
\end{verbatim}
\normalsize
gibi şablon sadece \emph{progQ.c} ve \emph{progx.c} değil aynı zamanda \emph{prog\_.c} ile de eşleşir.(ASCII tablosunu kontrol ediniz, örn. "\emph{man ascii}" kullanarak.) Eğer "sadece büyük ve küçük harf" eşleştirmek istiyorsanız, bunu
\footnotesize
\begin{verbatim}
prog[A-Za-z].c
\end{verbatim}
\normalsize
kullanarak gerçekleştirebilirsiniz.
\footnotesize
\begin{verbatim}
prog[A-Za-z].c
\end{verbatim}
\normalsize
şeklindeki bir yapı, harfler gibi şüpheli gözükse de, çift noktalı karakterleri yakalamaz.
Daha fazla kolaylık sağlamak için, "bunların dışındaki tüm karakterler" gibi yorumlanan olumsuz karakter sınıfları belirleyebilirsiniz:
\footnotesize
\begin{verbatim}
prog[!A-Za-z].c
\end{verbatim}
\normalsize
gibi bir ifade "g" ve "." arasında harf olmayan karakterli eşler. Her zamanki gibi, bölü işareti hariç.
\end{subsection}
\begin{subsection}{Küme Parantezleri}
Aşağıdaki ifadelerdelerdeki küme parantezlerinin genişlemesi
\footnotesize
\begin{verbatim}
{red,yellow,blue}.txt
\end{verbatim}
\normalsize
uzak bir ilişli olmasına rağmen kabuk arama şablonları ile ifade edilir. Kabuk bunu
\footnotesize
\begin{verbatim}
red.txt yellow.txt blue.txt
\end{verbatim}
\normalsize
olarak değiştirir.
Genellikle, küme parantezleri içerisinde virgüllerle ayrılmış metin içeren bir kelime, herbir kelimenin küme parantezi içerisindeki bir parça ile teker teker değiştirilmesi ile oluşan kelimeler ile değiştirilir. \emph{Bu değiştirilme tamamen komut satırında metin tabanlıdır ve herhangi dosya veya dizinin tamamen olup veya olmamasından bağımsızdır}, sistemde gerçekte yol ismi olarak bulunan isimleri üreten arama şablonlarından farklıdırlar.
Bir kelime için kartezyen çarpım olarak sonuçlanacak birden fazla küme parantezi ifadeniz olabilir, diğer kelimeler bütün olası kombinasyonlardır:
\footnotesize
\begin{verbatim}
{a,b,c}{1,2,3}.dat
\end{verbatim}
\normalsize
ifadesi
\footnotesize
\begin{verbatim}
a1.dat a2.dat a3.dat b1.dat b2.dat b3.dat c1.dat c2.dat c3.dat
\end{verbatim}
\normalsize
sonucunu üretir.
Bu kullanışlıdır, örneğin, sistematik olarak yeni dizinler oluşturmak için işe yarar, arama şablonları burada yardımcı olamaz, onlar sadece zaten varolan şeyleri bulabilir:
\footnotesize
\begin{verbatim}
$ mkdir -p revenue/200{8,9}/q{1,2,3,4}
\end{verbatim}
\normalsize
\paragraph{{\Huge{\PencilLeftDown}}Alıştırmalar}{
\begin{enumerate}
\item Aşağıda mevcut dizindeki dosyalar listelenmiştir\begin{verbatim}
prog.c prog1.c prog2.c progabc.c prog
p.txt p1.txt p21.txt p22.txt p22.dat
\end{verbatim}Bu isimler hangi arama şablonuyla eşleşir? (a) \emph{prog*.c}, (b) \emph{prog?.c}, (c) \emph{p?*.txt}, (d) \emph{p[12]*}, (e) \emph{p*}, (f) \emph{*.*}
\item "\emph{ls}" ile "\emph{ls *}" arasındaki fark nedir? (İpucu: İkisini de alt dizinler içeren bir dizinde deneyin)
\item Aşağıdaki komut neden gösterilen çıktıyı üretir:
\footnotesize
\begin{verbatim}
$ ls
-l file1 file2 file3
$ ls *
-rw-r--r-- 1 joe users 0 Dec 19 11:24 file1
-rw-r--r-- 1 joe users 0 Dec 19 11:24 file2
-rw-r--r-- 1 joe users 0 Dec 19 11:24 file3
\end{verbatim}
\normalsize
\item "*" kullanımında neden nokta ile başlayan dosya isimleri eşlenmez?
\end{enumerate}}
\paragraph{}{
\begin {table}[H]
\caption {\emph{cp} seçenekleri} \label{tab:tablo63}
\begin{tabular}{c c l}
\hline
{} & Seçenek & Sonuç \\
\hline
-b & (yedek) & Varolan hedef dosyalarının yedek kopyalarını isimleri ile tildayı ilişkilendirerek alır. \\
-f & (zorla) & Varolan hedef dosyaları sorgu mesajı vermeden üzerine yazar. \\
-i & (etkileşimli) & Varolan hedef dosyalarının üzerine yazılıp yazılmayacağını sorar(dosya başına bir kez). \\
-p & (korumak) & Kaynak dosyanın bütün özelliklerini korumak için kopyalamaya çalışır \\
-R & (özyinelemeli) & Dizinleri tüm içerikleriyle birlikte kopyalar \\
-u & (güncelleme) & Yalnızca kaynak dosya hedef dosyadan yeni ise kopyalar(veya hedef dosya bulunmuyorsa) \\
-v & (ayrıntılı) & Ekrandaki tüm faaliyeti görüntüler \\
\hline
\end{tabular}
\end {table}
}
\end{subsection}
\end{section}
\begin{section}{Dosyalar ile ilgili işlemler}
\begin{subsection}{Kopyalama, Taşıma ve Silme — cp ve Arkadaşları}
İstediğiniz dosyaları cp ("copy")("kopyala") komutu kullanarak kopyalayabilirsiniz. iki temel yaklaşım vardır:
Eğer cp'ye kaynak ve hedef dosya isimlerini (iki argüman) söylerseniz kaynak dosyanın içeriğinin 1:1 kopyasını hedef dosyada oluşturabilirsiniz. Eğer hedef dosya zaten varsa genelde cp üzerine yazılması gerekip gerekmediğini sormaz, fakat sadece yapar—Uyarı (veya -i parametresi) bunun için vardır.
Ayrıca hedef dosya ismi yerine hedef dizin ismi verebilirsiniz. Kaynak dosya eski ismini koruyarak o dizine kopyalanmış olacaktır.
\begin{verbatim}
$ cp list list2
$ cp /etc/passwd .
$ ls -l
-rw-r--r-- 1 joe users 2500 Oct 4 11:11 list
-rw-r--r-- 1 joe users 2500 Oct 4 11:25 list2
-rw-r--r-- 1 joe users 8765 Oct 4 11:26 passwd
\end{verbatim}
Bu örnekte, ilk list dosyasının tam kopyasını list2 isminin altına oluşturduk. Sonra /etc/passwd dosyasını bulunduğumuz dizine (hedef dizin ismi olan nokta ile temsil edildi) kopyaladık. En önemli cp parametreleri Tablo ~\ref{tab:tablo63}'te listelenmiştir. Tek kaynak dosyası yerine, kaynak dosyalarının daha uzun listesine(veya kabuk genel arama şablonuna) izin veriliyor. Ancak, bu yöntemde farklı isimli dosyaları kopyalamak olanaksızdır, fakat sadece farklı dizine kopyalanabilir. DOS'ta her TXT dosyasının aynı isimde ve BAK uzantısıyla “COPY *.TXT *.BAK” kullanarak yedek kopyalarını almak mümkün iken, Linux "cp *.txt *.bak" komutu genellikle bir hata mesajıyla sonuçlanacaktır.
Bunu anlamak için, kabuğun bu komutu nasıl çalıştırdığını kafanızda canlandırmak zorundasınız. Önce tüm genel arama şablonları için uygun dosya isimleriyle birlikte değiştirmeye çalışır, örneğin *.txt ile letter.txt ve letter.txt'yi. *.bak'ın *.txt uzantısında bağımlılığı ve mevcut dizinde*.bak için eşleşmeyen dosya isimleri sonucunda ne olur? Ama sonuç neredeyse hiç DOS kullanıcısının beklentisi olmayacak! Genellikle kabuk cp komutunda varolan bu dizin isminden(olası muhtemel) beri cp'nin görüş açısından başarısız olduğu genişletilmemiş *.bak genel arama şablonunu son argüman olarak alıp geçecektir.
cp komutu dosyanın tam kopyasını yaparken, fiziksel olarak saklama ortamı üzerinde dosya çoğaltılıyor ya da yeni, özdeş bir tanesi farklı depolama ortamında oluşturuluyor, mv ("move")("taşıma") komutu dosyayı farklı bir yere taşır veya adını değiştirmeyi sağlar. Bu kesinlikle dizin içeriğine bağlı bir işlemdir, tabi dosya farklı bir dosya sistemine taşınmadıkça — örneğin sabit disk bölümünden USB diske kopyalamak gibi. Bu olayda dosyanın fiziksel olarak taşınması, dosyanın yeni yere kopyalanması ve eski olanın silinmesi gereklidir.
mv'nin söz dizimi ve kuralları cp'ninkiler ile özdeştir — yine yalnızca bir tane yerine kaynak dosyalarının listesini belirtebilirsiniz, ve bu durumda komut sizden son argüman olarak dizin adını bekler. Temel fark mv dosyalar kadar iyi bir şekilde dizinleri de yeniden isimlendirebilirsiniz.
mv'nin -b, -f, -i, -u ve -v parametreleri cp ile tanımlanmış özelliklere karşılık gelir.
\begin{verbatim}
$ mv passwd list2
$ ls -l
-rw-r--r-- 1 joe users 2500 Oct 4 11:11 list
-rw-r--r-- 1 joe users 8765 Oct 4 11:26 list2
\end{verbatim}
Bu örnekte asıl dosya olan list2 passwd dosyasının yeniden isimlendirilmesiyle değiştirilmiştir. cp gibi mv de eğer hedef dosya adı varsa onaylamak için sormaz, acımasızca üstüne yazar.
Dosyaları silmek için olan komuta rm ("remove")("kaldırma") denir. dosyayı silmek için bulunduğunuz dizinde yazma yetkinizin olması gerekir. Bu nedenle hatta size ait olmayan dosyaları bile düzgün bir şekilde kaldırabildiğiniz ev dizininizde "malikane efendisi" sayılırsınız.
Dosya üzerinde yazma yetkisi, diğer deyişle, tamamen alakasız silme işleminde ilgili dosyadaki gibi, dosyanın hangi kullanıcı veya grupta olduğuna bağlıdır. rm işini cp veya mv gibi acımasızca ele alır—onaylama olmaksızın dosya sisteminden tamamen silinen söz konusu dosyalar gibi. Özellikle dikkatli olmalısınız, bilhassa kabuk genel arama şablonları kullandığınızda. Linux'ta dosya ismindeki nokta karakterinin DOS'ta özel bir anlamı yoktur. Bu nedenle, "rm *" komutu bulunan dizinde tüm gizli olmayan dosyaları siler. Alt dizinler zarar görmeden kalacaktır; ayrıca "rm -r *" ile onlar da silinebilir.
Sistem yöneticisi olarak, "rm -rf /" gibi bir komut ile tüm sistemi çöp yapabilirsiniz; son derece önem gereklidir! “rm -rf foo*” yerine “rm -rf foo *” yazmak kolaydır.
rm'nin sildiği bütün dosyalarda bazı isimlilerin silinmemesi gerekiyorsa,"rm -i" biraz daha dikkatli bir şekilde işler:
\begin{verbatim}
$ rm -i lis*
rm: remove 'list'? n
rm: remove 'list2'? y
$ ls -l
-rw-r--r-- 1 joe users 2500 Oct 4 11:11 list
\end{verbatim}
Bu örnek, her dosya için, rm silinmesi gerekip gerekmediğini ("evet" için "e") ve ("hayır" için "h") olarak sorduğunu anlatır.
KDE gibi masaüstü ortamları genellikle dosya yöneticisinden geri dönüşümü olası olan dikkatsizce silinen dosyaları görüntüleyen "çöp kutusu" gösterimine destek verir. Komut satırı için benzer yazılım paketleri vardır.
Ek olarak -i ve -r parametrerin, rm cp'nin -v ve -f parametrelerinin kullanımına izin verir ve benzer sonuçlar üretir.
\paragraph{{\Huge{\PencilLeftDown}}Alıştırmalar}{
\begin{enumerate}
\item Kendi ev dizininizde myservices denilen /etc/services dosyasının kopyasını oluşturun. Bu dosyayı srv.dat olarak tekrar isimlendirin ve /tmp dizinine kopyalayın (yeni adını koruyarak). Dosyanın iki kopyasını da silin.
\item mv neden -R parametresine sahip değildir(cp'nin sahip olduğu gibi)?
\item Farzedelim ki dizinlerinizden biri "-file" isminde bir dosya içersin (isminin başında tire karakteri bulunsun). Bu dosyayı silmek için nasıl bir yol izlersiniz?
\item Eğer "rm *"'ye kazara kurban gitmesini istemediğiniz yerde bir dizininiz olsa \begin{verbatim}
$ > -i
\end{verbatim}gibi içerisinde "-i" denilen bir dosya oluşturabilirsiniz (Bölüm ~\ref{chap:bolum8}'de daha fazla detay açıklanacaktır). Eğer "rm *" komutunu çalıştırsanız ne olur? Neden?
\end{enumerate}}
\end{subsection}
\begin{subsection}{Dosyaların bağlanması — ln ve ln -s}
\label{sec:bolum642}
Linux dosyalara "bağlantılar" adı verilen referanslar oluşturmaya izin verir, ve böylece aynı dosyaya birkaç isim atanabilir. Fakat bu neyi amaçlar? Dosya ve dizin isimleri için olan kısayollar, uygulamaların erişmesinde oluşturulması istenmeyen dosya silme işlemleri için güven, programcılar için kolaylık, geniş dizin ağaçları için alan tasarrufu sağlar ve birkaç sürümlerinde sadece küçük farklılıklarla mevcut olmalıdır.
ln("link")("bağlantı") komutu varolan dosyaya (ilk argüman) ek olarak, yeni bir isim(ikinci argüman) ataması yapar.
\begin{verbatim}
$ ln list list2
$ ls -l
-rw-r--r-- 2 joe users 2500 Oct 4 11:11 list
-rw-r--r-- 2 joe users 2500 Oct 4 11:11 list2
\end{verbatim}
Dizinin şimdi list2 isminde yeni bir dosya içerdiği görülür. Aslında aynı dosyaya sadece iki tane referans vardır. Bu bilgi referans sayıcısı tarafından "ls -l" çıktısının ikinci sütununda ipucu olarak verilir. Değeri 2'dir, dosyanın gerçekten 2 tane isme sahip olduğunu belirtir. İki dosya isimlerinin gerçekten aynı dosyaya referans olup olmadığını, sadece "ls -i" komutu kullanarak tespit edebilirsiniz. Bu durumda, ilk sütundaki dosya numarası, iki dosya için de özdeş olmalıdır. Dosya numaraları, ayrıca inode (indeks düğümü) numaraları da denir, dosya sisteminde dosyaları eşsiz olarak tanımlar:
\begin{verbatim}
$ ls -i
876543 list 876543 list2
\end{verbatim}
"Inode", "indirection node"'un kısaltmasıdır. Dosya numaraları, dosyaların hakkında ismi haricinde tüm bilgiyi tutar. Her dosya için kesinlikle bir tane dosya numarası vardır.
Eğer dosyalardan birinin içeriğini değiştirmek isterseniz, diğerinin içeriği de değişir, fakat aslında sadece bir tane dosya vardır (eşsiz dosya numarası 876543 olan). Biz sadece dosyaya başka bir isim verdik.
Dizinler dosya numaraları için dosya isimlerini eşlemede basit bir tablo görünümü üstlenirler. Açıkçası tabloda farklı isim içeren fakat aynı dosya numarası olan birçok girdi olabilir. İsim ve dosya numarasıyla birlikte olan dizin girdisine "bağlantı" adı verilir. İki bağlantısı bulunan dosya için, "orijinal" isme sahip olanı bulmanın imkansız olduğunu farketmelisiniz, ln komutu içerisindeki ilk parametre örnek olarak verilebilir. Sistemin bakış açısından iki isim tamamen farksızdır ve birbirine eşittir.
Bu arada, dizinlere bağlantı atamak Linux'ta geçerli değildir. Yalnızca, sistemin baktığı her dizin için sadece "." ve ".." birer istisnadır. Dizinlerin ayrıca dosya olduğu ve kendi dosya numaralarına sahip olduklarından beri, dosya sisteminin nasıl içten bir şekilde uyguğunun izini sürebilirsiniz (Ayrıca bkz. Alıştırma 6.19).
İki dosyadan birinin silinmesi, dosya numarası 876543 için olan isimlerin azalmasına yol açar. Referans sayıcısını 0 değerine ulaşmadan önce dosyanın içeriği aslında silinmiş olur.
\begin{verbatim}
$ rm list
$ ls -li
876543 -rw-r--r-- 1 joe users 2500 Oct 4 11:11 list2
\end{verbatim}
Dosya numaralarının sadece aynı fiziksel dosya sistemi (disk bölümü, USB sürücü, \ldots) içerisinde eşsiz olduğundan beri, bu tür bağlantılar sadece dosyanın bulunduğu aynı dosya sistemi üzerinde geçerlidirler.
Dosyanın içeriğinin silinmesi hakkındaki açıklama tam olarak doğru değildir: Eğer son dosya adı silinmişse, dosya artık açılamayabilir, fakat eğer bir süreç hala dosyayı kullanıyorsa, dosyanın açık bir şekilde kapanana veya sonlanmasına kadar devam edebilir. Unix sisteminde program sonlandırıldığında dosyanın yok olması geçici dosyaların işlemesi için yaygın bir deyimdir: Yazma, okuma için oluşturduğunuz dosyayı sonra hemen silebilirsiniz. Daha sonra dosyaya veriyi yazabilir ve devamında geri atlayıp başa dönerek tekrar okuyabilirsiniz.
ln'yi sadece iki dosya ismi argümanları değil ayrıca bir veya daha fazlası ile çalıştırabilirsiniz. İlk durumda, orijinal olarak aynı isimli bağlantı mevcut dizinde oluşturulacaktır (dosyanın konumlandığı yerde bi gerçekten farklı olmalı), ikinci durumda tüm isimlendirilen dosyalar son argüman olarak verilen dizinde orijinal adları "bağlanmış" olacaktır (mv gibi).
Hepsi bu kadar değil ancak: Linux sistemlerinde iki farklı tip bağlantı türü vardır. "sıkı bağ" denilen tür, ln komutu için ön tanımlı durum altında açıklanmıştır. Dosyayı teşhis etmek için daima dosya numarasını kullanır. Ek olarak, sembolik bağlantılar da vardır(ayrıca "sıkı bağlara" zıt olarak "dayanıksız bağ" adı verilir). Sembolik bağlantılar gerçekten bağlantı ismindeki "hedef dosya"yı içerirler, bayrak ile birlikte dosyanın sembolik link olduğunu belirtir ve erişim de hedef dosyaya yeniden yönlendirilerek yapılmalıdır.
Hard bağlantıların aksine, hedef dosya sembolik bağlantı hakkından hiçbir "şey" bilmez. Sembolik bağlantının oluşturulması veya silinmesi hiçbir şekilde hedef dosyayı etkilemez; ancak hedef dosya silindiğinde sembolik bağlantı "asılı" kalır, yani hiçbir yere referans olmaz (erişim sonucunda bir hata mesajı görüntülenir).
Sıkı bağların aksine, sembolik bağlantılar farklı fiziksel dosya sistemlerinde dosyalardaki gibi dizinlere bağlantı oluşturmaya izin verirler. Uygulamada, yol isimlerinin anlamı yoluyla bağın izinin tutulmasından beri, sembolik bağlantılar kolay olmasından dolayı sıklıkla tercih edilir.
Dosya veya dizin isimleri değiştiğinde fakat isteğe bağlı olarak geriye uyumluluk istenmesi açısından sembolik bağlantılar popülerdir. Örneğin kullanıcının posta kutuları (okunmamış elektronik posta içerir) /var/mail dizini altında depolanmalıdır. Geleneksel olarak, bu dizine /var/spool/mail denmiştir, ve birçok programın içinde bu değer doğrudan koda gömülüdür. /var/mail'e geçişi hafifletmek için, dağıtım /var/mail'e işaret eden /var/spool/mail adı altında sembolik bağlantı içermiş bir biçimde ayarlanabilir (Sıkı bağlantıların dizinlere uygulanmasının geçerli olmadığı zamanlarda, sıkı bağlantılar kullanarak bunu yapmak imkansız olacaktır).
Sembolik bağlantı oluşturmak için, ln'ye -s parametresini vermelisiniz:
\begin{verbatim}
$ ln -s /var/log short
$ ls -l
-rw-r--r-- 1 joe users 2500 Oct 4 11:11 liste2
lrwxrwxrwx 1 joe users 14 Oct 4 11:40 short -> /var/log
$ cd short
$ pwd -P
/var/log
\end{verbatim}
"-s" parametresi ile oluşturulan "dayanıksız bağlantılar"'ın aksine, ln komutu -b önceden bahsettiğimiz -b, -f, -i, ve -v parametrelerine destek verir. Artık ihtiyaç kalmayan sembolik bağlantıları kaldırmak için, düz dosyaları siler gibi kullanılan rm ile silinebilir. Bu işlem bağlantının hedefinden ziyade bağlantıya etki eder.
\begin{verbatim}
$ cd
$ rm short
$ ls
liste2
\end{verbatim}
\paragraph{}{
\begin {table}[H]
\caption {more için klavye komutları} \label{tab:tablo64}
\begin{tabular}{c l}
\hline
Tuş & Sonuç\\
\hline
\Return & Scrolls up a line\\
\keystroke & Scrolls up a screenful\\
\keystroke{b} & Scrolls back a screenful \\
\keystroke{h} & Displays help \\
\keystroke{q} & Quits more \\
\keystroke{/} $<$kelime$>$ \Return & Searches for $<$kelime$>$\\
\keystroke{!} $<$komut$>$ \Return & Executes $<$komut$>$ in a subshell\\
\keystroke{v} & Invokes editor (vi)\\
\Ctrl + \keystroke{l} & Redraws the screen\\
\hline
\end{tabular}
\end {table}}
\paragraph{{\Huge{\PencilLeftDown}}Alıştırmalar}{
\begin{enumerate}
\item Kendi ev dizininizde, keyfi içerikli bir dosya oluşturun(örneğin “echo Hello >~/hello” veya bir metin editörü kullanarak). link denilen dosyaya bir sıkı bağlantı oluşturun. Dosyanın iki tane isme sahip olduğundan emin olun. Dosyayı metin editörüyle değiştirmeye çalışın. Ne oluşur?
\item Geçenki alıştırmadaki dosyaya ~/symlink denilen bir bağlantı oluşturun. Sembolik bağlantının çalıştırılması yardımıyla dosyaya erişimin yapılıp yapılmadığını kontrol edin. Eğer sembolik bağlantının işaret ettiği dosyayı silerseniz ne olur?
\item Hangi dizinin .. bağlantısı "/" dizinine işaret eder?
\item Aşağıdaki komutu ve çıktısına göz atınız:\begin{verbatim}
$ ls -ai /
2 . 330211 etc 1 proc 4303 var
2 .. 2 home 65153 root
4833 bin 244322 lib 313777 sbin
228033 boot 460935 mnt 244321 tmp
330625 dev 460940 opt 390938 usr
\end{verbatim} Açıkça / ve /home dizinleri aynı dosya numarasına sahip olduğu görülüyor. Hani iki dizin açıkça aynı dizinde bulunamazdı? Bu olguyu açıklayabilir misiniz?
\item Dizinlere sıkı bağlantı yapılmasının geçerli olmadığına önceden değinmiştik. Bunun nedeni nedir?
\item “ls -l ~”'nin çıktısında, ~'nin altdizininin alt dizinler içermediğini nasıl söyleyebilirsiniz?
\item (Zeka oyunu/araştırma alıştırması:) Diskte sembolik bağlantı veya sıkı bağlantı için ne gereklidir? Neden?
\end{enumerate}}
\end{subsection}
\begin{subsection}{Dosya İçeriğinin Görüntülenmesi—more ve less}
Metin dosyalarının ekranda kullanışlı ve olanaklı olarak görüntülenmesinde, uzun dökümanları sayfa sayfa görmenizi sağlayan more komutu çok yardımcı bir araçtır. Çıktı, bir ekrandan sonra ve "--More--"'un son satırda(zaten görünen dosyanın yüzdesi tarafından tespit edilir) görüntülenmesinden sonra durur. Çıktı bir tuşa bastıktan sonra devam eder. Çeşitli tuşların anlamları Tablo ~\ref{tab:tablo64}'te gösterilmiştir.
more ayrıca bazı parametreleri alır. -s("squeeze")("sıkıştırma") ile, boş satırların bulunduğu alanlar sadece bir tanesi kalacak şekilde sıkıştırılır, -l parametresi sayfa çıktısını yoksayar (genellikle "\^L" olarak tanımlanır) aksi halde çıktıyı durdurur. -n$<$number$>$ $<$sayı$>$ parametresi ekrandaki gösterilen satır sayılarını ayarlar, aksi halde more terminal tanımlamasına referans oluşturan TERM'den sayıyı alır.
more'un çıktısında hala çıktının başlangıcına doğru geri gitmenin genel olarak imkansız olması gibi can sıkan sınırlamalar vardır. Bu sebeple, gelişmiş sürümü olan less (hafif bir kelime oyunu var— "less is more" ("less daha fazla") olarak düşünün) daha fazla [böyle!] günümüzde çoklukla görülür. less her zamanki gibi yön tuşlarıyla metin çevresinde dolaşmanıza imkan tanır, arama alışkanlıkları geliştirilmiştir ve metininin başına/sonuna gitmeye izin verir. En yaygın kullanılan klavye komutları Tablo ~\ref{tab:tablo65}'te özetlenmiştir.
Bölüm ~\ref{chap:bolum5}'te bahsettiğimiz gibi, less genellikle man aracılığıyla kılavuz sayfalarını görüntüleyen bir program gibi hizmet eder. Böylece kılavuz sayfalarını incelerken tüm komutlar mevcuttur.
\end{subsection}
\begin{subsection}{Dosya arama - find}\label{sec:bolum644}
"Burada foobar dosyası olmalı \ldots fakat nereye koymuştum?" şeklinde kim böyle bir hisse kapılmadı ki? Tabi ki sıkıcı bir şekilde tüm dizinlerinizi elinizle gezebilirsiniz. Fakat eğer bir şeyi kullanışlı kılmak için yardım etmezse Linux, Linux olmaz.
find komutu dizin ağacında özyinelemeli bir şekilde verilen kriterlere göre eşleşen dosyaları arar. "Özyinelemeli" alt dizinlerin, alt dizinleri şeklinde göz önünde bulundurarak devam eden anlamı içerir. find'ın çıktısı eşleşen dosyaların sonrasında diğer programlara aktarılabilecek olan yol isimlerini içerir. Sonraki örnek komut yapısını tanımlar:
\paragraph{}{
\begin {table}[H]
\caption {less için klavye komutları} \label{tab:tablo65}
\begin{tabular}{c l}
\hline
Tuş & Sonuç\\
\hline
\DArrow veya \keystroke{e} veya \keystroke{j} veya \Return & Scrolls up one line\\
\keystroke{f} veya \keystroke{} & Scrolls up one screenful\\
\UArrow veya \keystroke{y} veya \keystroke{k} & Scrolls back one line\\
\keystroke{b} & Scrolls back one screenful\\
\Home veya \keystroke{g} & Jumps to the beginning of the text\\
\Enter veya \Shift + \keystroke{g} & Jumps to the end of the text\\
\keystroke{p} $<$percent$>$ \Return & Jumps to position $<$percent$>$ (in \%) of the text\\
\keystroke{h} & Displays help\\
\keystroke{q} & Quits less\\
\keystroke{/} $<$word$>$ \Return & Searches for $<$word$>$ towards the end\\
\keystroke{n} & Continues search towards the end\\
\keystroke{?} $<$word$>$ \Return & Searches for $<$word$>$ towards the beginning\\
\Shift + \keystroke{n} & Continues search towards the beginning\\
\keystroke{!} $<$command$>$ \Return & Executes $<$command$>$ in subshell\\
\keystroke{v} & Invokes editor (vi)\\
\keystroke{r} veya \Ctrl + \keystroke{l} & Redraws screen\\
\hline
\end{tabular}
\end {table}}
\begin{verbatim}
$ find . -user joe -print
./list
\end{verbatim}
Bu komut mevcut dizinde tüm alt dizinlerin dahilinde joe kullanıcısına ait olan dosyaları arar. -print komutu terminalde sonucu görüntüler (bizim örneğimizde tek dosya). Kolaylık için, eğer eşleşen dosyalarla ne yapacağınızı belirlemediyseniz, -print varsayılan olacaktır.
find kendi işini yaparken birkaç argümana ihtiyacı olduğunu göz önünde bulundurun.
Başlangıç dizini özenle seçilmelidir. Eğer kök dizinini seçerseniz, gerekli dosya(lar) —eğer varsa— kesinlikle bulunacaktır, fakat arama uzun zaman alır. Tabi ki sadece bu dosyaları uygun ayrıcalıklı yerlerde ararsınız. Başlangıç dizini için tam yol adı vermek çıktıdaki dosya isimlerinin mutlak olmasına neden olur, başlangıç dizini için göreceli yol adları doğrultusunda göreli yol adları üretir. Tek başlangıç dizini yerine, dönüşte aranacak dizinlerin listesini belirleyebilirsiniz.
Bu parametreler dosyalar üzerinde detaylı bir şekilde gereksinimleri tanımlar. Tablo ~\ref{tab:tablo66}'da en önemli denemeler gösterilmiştir. find belgeleri çok daha fazlasını açıklar.
\paragraph{}{
\begin {table}[H]
\caption {find için deneme durumları} \label{tab:tablo66}
\begin{tabular}{c l}
\hline
Deneme & Açıklama \\
\hline
-name & Dosya adı örneğini belirler. Tüm kabuk arama şablonu karakterleri geçerlidir. -iname parametresi büyük/küçük harf farklılıklarını yoksayar. \\
-type & Dosya türünü belirler (bkz. Bölüm ~\ref{sec:bolum102}). İçerdikleri:\\
& b blok aygıt dosyası\\
& c karakter aygıt dosyası\\
& d dizin\\
& f düz dosya\\
& l sembolik bağlantı\\
& p FIFO (adlandırılmış yöneltme)\\
& s Unix alan soketi\\
-user & Kullanıcıya ait olan dosyayı belirler. Kullanıcı adları, sayısal kullanıcı kimlikleri gibi verilebilir.\\
-group & Gruba ait olan dosyayı belirler. -user gibi grup adları, sayısal grup kimlikleri gibi verilebilir.\\
-size & Ayrıntılı dosya boyutunu belirler. Sade sayılar 512-byte'lık bloklar halinde ifade edilir; byte'lar veya kibibayt'lar sırasıyla c veya k ekleyerek verilebilir. Önce gelen artı veya eksi işareti alt veya üst sınırı gösterir; Örneğin, -size +10k, 10Kib'den büyük olan dosyalarla eşleşir.\\
-atime & (ing. access) son erişim(okuma/yazma) tarihi bazında dosyaları aramaya imkan tanır. Bu ve sonraki iki deneme gün olarak argüman alır; …time yerine …min 1 dakika hassasiyetle işler.\\
-mtime & (ing. modification) değiştirme zamanına göre seçer.\\
-ctime & (ing. change) son dosya numarası zamanının değiştirilmesine göre seçer(including içeriğe erişim, dosya yetki değişimi, yeniden isimlendirme, vb.)\\
-perm & Dosyanın eşleşmesi gerektiği yetkiler kümesini belirler. Yetkiler sekizlik sayı sisteminde verilir. (bkz. chmod komutu)
Özellikle bir izin aramak için, sekizlik sayı eksi işaretiyle birlikte önce gelmek zorundadır, örneğin, -perm -20 komutu diğer izinlere bakılmaksızın, grup yazma izni olan tüm dosyalarla eşleşir.\\
-links & Uygun dosyaların eşleştiği referans sayı değerini belirler.\\
-inum & Verilen dosya numarasıyla eşleşen bağlantıları bulur.\\
\hline
\end{tabular}
\end {table}
}
\paragraph{}{
\begin {table}[H]
\caption {find için mantıksal operatörler} \label{tab:tablo67}
\begin{tabular}{l c l}
\hline
Parametre & Operatör & Anlam\\
\hline
! & Değil & Sonraki deneme eşleşmemelidir\\
-a & Ve & -a'nın sağ ve sol yanındaki iki deneme de eşleşmelidir\\
-o & Veya & -o'nun sağ veya sol yanındaki iki denemeden en azından biri eşleşmelidir\\
\hline
\end{tabular}
\end {table}
}
Eğer çoklu denemeler aynı zamanda verilirse, eşleşecek dosyaların hepsi dolaylı olarak birlikte mantıksal VE işlemine uğrarlar. find ek mantıksal operatörlere destek verir (Tablo ~\ref{tab:tablo67}'ye bakınız).
Mantıksal operatörleri denerken hatalardan kaçmanın yolu, denemelerin parantezlerle kapatılmasıdır. Parantezler tabi ki kabuktan kaçırılmış olmalıdır:
\begin{verbatim}
$ find . \( -type d -o -name "A*" \) -print
./.
./..
./bilder
./Attic
$ _
\end{verbatim}
Bu örnek dizine işaretçi olan veya "A" ile başlayan, ya da her ikisi koşulundaki dosyaların isimlerini listeler.
\paragraph{Eylemler} Önceden bahsettiğimiz gibi, arama sonuçları ekranda -print parametresiyle görüntülenebilir. Buna ek olarak, -exec ve -ok adında dosya isimleri içeren komutları çalıştıran 2 parametre vardır. -ok ve -exec arasındaki tek fark, -ok gerçekten komutu çalıştırmadan önce bilgi için kullanıcıya sorar; -exec ile üstü kapalı bir şekilde bu işlemin yapıldığı varsayılır. Biz -exec'i ele alırken kendimizi kısıtlayacağız.
-exec parametresini yöneten bazı genel kurallar şunlardır:
\begin{itemize}
\item -exec'in devamındaki komut noktalı virgül (";") ile sonlandırılmak zorundadır. Birçok kabuklarda noktalı virgülün özel karakter olduğundan beri, find'ı görünebilir yapmak için noktalı virgül kaçırılmış olmak zorundadır (örneğin "\textbackslash" veya yorumların kullanımı gibi).
\item Komutun içerisindeki iki süslü parantez ("\{\}") bulunan isimle, dosya ismini yer değiştirir. Bu dosya adlarında boşluk sorunlarını önlemek için tırnak içinde parantez içine almak en iyisidir.
\end{itemize}
Örneğin;
\begin{verbatim}
$find . -user joe -exec ls -l '{}' \;
-rw-r--r-- 1 joe users 4711 Oct 4 11:11 file.txt
$ _
\end{verbatim}
Bu örnek mevcut dizin(ve altında) içerisindeki tüm dosyaların her biri için için test kullanıcısına ait olanları arar ve "ls -l" komutunu çalıştırır. Aşağıdaki daha mantıklı olacaktır:
\begin{verbatim}
$ find . -atime +13 -exec rm -i '{}' \;
\end{verbatim}
Bu etkileşimli olarak mevcut dizin(ve altındaki) son 2 haftadır erişilmeyen dosyaları siler.
Bazen - yukarıdaki son örnekteki gibi— bulunan her bir dosya adı için -exec kullanarak yeni bir süreç başlatmak çok verimsiz olur. Bu durumda komutu çalıştırmadan önce olası bütün dosya isimlerini toplayan xargs komutu kullanışlı olacaktır.
\begin{verbatim}
$ find . -atime +13 | xargs -r rm -i
\end{verbatim}
xargs standart girdiyi, maksimum (yapılandırılabilir) karakter veya satıra kadar okur ve bu materyali belirlenen komut için argüman olarak kullanır (bu örnekte rm). Girdide, argümanlar boşluk karakterleri (tırnaklar veya "\" kullanarak kaçırılabilir) veya yeni satırlar tarafından ayrılmıştır. Komut girişi bitirmeye gerektiği kadar çağrılır.— -r parametresi sadece eğer find gerçekten dosya ismi gönderdiyse çağrılmasını sağlar; aksi halinde en azından bir kez çalıştırılmış olacakatır.
Garip dosya isimleri find/xargs kombinasyonunun kullanımında sorun oluşturabilir, örneğin ayrıcılar olarak sorun olabilen boşluklar veya gerçekten de, yeni satırlar içerenler. Sihirli çözüm find'da "-print"'in yaptığı gibi dosya isimlerini çıktıya veren, fakat yeni satırlar yerine null byte'lar kullanarak ayıran "-print0" parametresinin kullanımıyla sağlanır. Null byte'ın yol isimlerinde geçerli karakter olmadığından beri, karışıklık artık mümkün değildir. xargs bu tarz girdideki gibi "-0" parametresi kullanarak çağırılmak zorundadır:
\begin{verbatim}
$ find . -atime +13 -print0 | xargs -0r rm -i
\end{verbatim}
\paragraph{{\Huge{\PencilLeftDown}}Alıştırmalar}{
\begin{enumerate}
\item Sisteminizdeki 1MB'dan daha büyük olan tüm dosyaları bulun ve isimlerini çıktıya verin.
\item Bir olağandışı isime sahip dosyayı find kullanarak nasıl silebilirsiniz (örneğin eski kabukların başa çıkamadığı görünmez kontrol karakterleri veya umlautlar)?
\item (Kitap aracılığıyla ikinci kez) Nasıl kendinize ait bir kez çıktığınızda silinen dosyaları koruma altına alırsınız?
\end{enumerate}}
\end{subsection}
\begin{subsection}{Çabukça Dosyaları Bulma - locate ve slocate}
find komutu birçok farklı kritere bağlı olarak dosyaları arar fakat başlangıç dizini altındaki dizin ağacını tamamen gezmek zorundadır. Ağaç boyutuna göre, bu dikkate değer bir zaman alır. Tipik bir uygulamada, belirli isimlerle aranan dosyalar—hızlandırılmış bir yöntem vardır.
locate komutu kabuk genel arama şablonunda eşleşen isimlere ait düm dosyaları listeler. En sıradan durumda, bu basit karakterlerin dizisidir:
\begin{verbatim}
$ locate letter.txt
/home/joe/Letters/letter.txt
/home/joe/Letters/grannyletter.txt
/home/joe/Letters/grannyletter.txt~
\end{verbatim}
Bununla birlikte oldukça önemli bir faydası olan locate (LPIC1 müfredatının parçasında bu olgu vurgulanmıştır), tüm Linux dağıtımlarında varsayılan yüklemenin bir parçası değildir. Örneğin, eğer bir SUSE dağıtımı kullanıyorsanız, locate kullanabilmek için önce açıkça findutils-locate paketini kurmanız gerekir.
"*", "?", ve "[\ldots]" karakterleri kabukta yaptıkları gibi locate'te de aynı görevi üstlenirler. Fakat genel arama karakterleri olmayan sorgu herhangi bir yerdeki şablonun içerdiği tüm dosya isimleri ile yerleşirken, genel arama karakterleriyle yapılan sorgu sadece tamamen, baştan sona, şablonun tasvir ettiği isimleri geri döndürür. Bu nedenle locate için olan şablon sorguları genellikle "*" ile başlar:
\begin{verbatim}
$ locate "*/letter.t*"
/home/joe/Letters/letter.txt
/home/joe/Letters/letter.tab
\end{verbatim}
Kabuk genel arama karakterleri içeren locate sorgularının açılmaya çalışılmasından kabuğu korumak için etrafına tırnaklar koyduğunuzdan emin olun.
Bölü ("/") özel olarak işlenmez:
\begin{verbatim}
$ locate Letters/granny
/home/joe/Letters/grannyletter.txt
/home/joe/Letters/grannyletter.txt~
\end{verbatim}
locate çok hızlıdır çünkü dosya sistem ağacında gezinmez, fakat önceden ubdatedb programı kullanılarak oluşturulması gereken dosya isimleri "veritabanı"'nı kontrol eder. Bu son veritabanı güncellemesinden beri sisteme eklenen dosyaların locate tarafından yakalanamayacağı anlamına gelir ve aksi bir şekilde bu zamanda silinmiş olan dosyaların isimlerini de çıktıya verebilir.
locate'in varolan dosyalarını sadece "-e" parametresi kullanarak alabillirsiniz, fakat bu yöntem locate'in hız avantajını reddeder.
updatedb program locate için veritabanı oluşturur. Bunun önemli büyüklükte zaman aldığından beri, sistem yöneticiniz genellikle bunu sistem çok iş yapmayacağı zaman (tahminen gece geç saatte) çalıştırılacak şekilde ayarlar. Bunun için gerekli olan cron hizmeti Advanced Linux'ta detaylarıyla anlatılacaktır. Şimdi birçok Linux dağıtımları ubdatedb'nin aralıklarla sık sık sık çalıştırılmasına neden olurlar.
Sistem yöneticisi olarak, veritabanı kurarken dikkate alınması gereken dosyaları updatedb 'ye söyleyebilirsiniz. Dağıtımınıza bağlı olarak neler olur detaylıca açıklayalım: updatedb kendi kendine konfigürasyon dosyasını okuyamaz, fakat ayarları komut satırından ve (kısmen) çevresel değişkenlerden alır. Buna rağmen, birçok dağıtım genellikle ilgili olan ortam değişkenlerinin bulunduğu /etc/updatedb.conf veya /etc/sysconfig/locate gibi dosyaları okuyan kabuk betiğinden updatedb'yi çağırır.
Örneğin /etc/cron.daily gibi bir dosya bulabilirsiniz (detaylar, dağıtımınıza bağlı olarak değişiklik gösterebilir).
Örnek olarak updatedb'nin belirli dizinlerdeki aramalarına ve bu arama işleminde diğer dosyaları atmalasona sebep olabilirsiniz; program ayrıca sadece bir bilgisayarın veritabanı oluşturnası gerektiği gibi, birçok bilgisayar tarafından kullanılan ve onların kendi kök dizinlerindeki veritabanlarında bulunan "ağ dosya sistemi"'ni belirlemenize imkan tanıyor.
Önemli bir yapılandırma ayarı da kullanıcı kimliğiyle updatedb'nin çalıştırılmasıdır. Temelde iki olasılık vardır:
\begin{itemize}
\item updatedb root gibi çalışır ve böylece veritabanındaki her dosyaya giriş yapabilir. Bu ayrıca kullanıcıların birbirlerininkine erişemediği dizinlerdeki dosya isimlerinin de görüntülenmesini sağlar, örneğin, diğer kullanıcıların ev dizinleri.
\item updatedb "hiçkimse" kullanıcıları gibi sınırlı ayrıcalıklarla çalışır. Bu durumda, sadece "hiçkimse" kullanıcısı tarafından okunabilen dizinlerdeki isimler görüntülenir.
\end{itemize}
slocate programı —alışılmış locate'e alternatif olarak— bu problemi dosyanın sahibi, grubu ve izinlerinin ve buna ek olarak dosyanın isminin de veritabanında bulunması sayesinde atlatır. Sadece slocate'i hangi kullanıcı çalıştırıyorsa o dosya ismini çıktıya verir, adeta söz konusu dosyaya erişmek gibi. slocate updatedb programıyla birlikte gelir, fakat bu sadece slocate için tahsis edilen bir isimdir.
Birçok durumda, slocate de ayrıca locate komutu gibi çalıştırılabilir.
\paragraph{{\Huge{\PencilLeftDown}}Alıştırmalar}{
\begin{enumerate}
\item README çok yaygın bir dosya ismidir. Sisteminizde README denilen tüm dosyaların mutlak yol isimlerini bulunuz.
\item Kendi ev dizininizde yeni bir dosya oluşturun ve locate çağırıldığında bu dosyanın listelenmeyeceği konusunda kendinizi ikna edin (uygun egzotik bir dosya adı kullandığınızdan emin olun. updatedb'i çalıştırın (büyük olasılıkla yönetici yetkileri kullanarak). locate sonradan sizin dosyanızı bulabildi mi? Dosyayı silin ve bu adımları tekrarlayın.
\item Kendinizi slocate'in /etc/shadow gibi dosyaları normal kullanıcı olarak çalıştırılıp arama yaptığına ikna edin.
\end{enumerate}}
\paragraph{Bu Bölümdeki Komutlar}{}
\begin{itemize}
\item[cd]Kabuğun mevcut çalışma dizinini değiştirir
\item[convmv] Karakter kodlamaları arasında dosya isimlerini dönüştürür
\item[cp]Dosyaları kopyalar
\item[find]Verilen belirli kriterler ile eşleşen dosyaları arar
\item[less]Metinleri(kılavız sayfaları gibi) sayfalar halinde görüntüler
\item[ln]"sıkı" veya sembolik bağlantıları oluşturur
\item[locate]Dosya ismi veritabanında verilen isme göre dosyaları bulur
\item[ls]Dosya bilgisi veya dizin içeriklerini görüntüler
\item[mkdir]Yeni dizinler oluşturur
\item[more]Metin verilerini sayfalar halinde görüntüler
\item[mv]Dosyaların ismini değiştirir veya istenilen dizinlere taşır
\item[pwd]Mevcut çalışma dizininin adını görüntüler
\item[rm]Dosyaları veya dizinleri siler
\item[rmdir]Boş dizinleri siler
\item[slocate]Dosya ismi veritabanında verilen isme göre hesaptaki dosya izinlerini alarak dosya arar
\item[updatedb]locate için dosya ismi veritabanı oluşturur
\item[xargs]Standart girdiden komut satırlarını oluşturur.
\end{itemize}
\paragraph{Özet}{
\begin{itemize}
\item Dosya isimleri neredeyse tüm olası karakterleri içerebilir. Ancak taşınabilirlik için, harfler, rakamlar ve bazı özel karakterler kullanmaya kendinizi alıştırmalısınız.
\item Linux dosya isimlerinde büyük/küçük harfleri ayırt eder.
\item Mutlak yol isimleri her zaman bölü işareti ile başlamalı ve söz konusu olan dosya veya dizin, kökten başlayarak dizin ağacıyla birlikte verilmelidir. Göreceli yol isimleri "mevcut dizin"'den başlar.
\item cd komutu kullanarak kabuğun mevcut dizinini değiştirebilirsiniz. Ve ismini pwd kullanarak görüntüleyebilirsiniz.
\item ls dosya ve dizinler hakkında bilgileri görüntüler.
\item mkdir ve rmdir kullanarak dizin oluşturabilir veya silebilirsiniz.
\item cp, mv ve rm komutları dosya ve dizinleri kopyalar, taşır ve siler.
\item ln komutu "sıkı" ve "sembolik" bağlantılar oluşturmanıza olanak tanır.
\item more ve less terminal çıktısında dosyaları (ve komut çıktısını) sayfalar halinde görüntülemeye yarar.
\item find belirli kriterlere göre eşleşen dosya ve dizinleri arar.
\end{itemize}}
\end{subsection}
\end{section}