bash etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
bash etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

2026-05-03

Bash ile tekrarlayan dosyaları bulma

Linux'ta terminalde tekrarlayan dosyaları bulmak için

find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD

Yapılanların kısa özeti:

find .                # mevcut klasör ve alt klasörleri ara
! -empty          # boş olmayanları bul
-type f        # dosyaları bul
-exec md5sum {} + # bulunan dosyaların md5 hash'lerini hesapla
| sort        # önceki komutun çıktısını sırala
| uniq -w32    # sıralananların içinde ilk 32 karakter için benzersizlik (uniq) karşılaştırması yap
-d          # tekrarlayanları göter
-D          # tekrarlayan tüm kopyaları listele 

2026-04-04

Linux terminalde basit matematik işlemleri

Powershell'de her türlü matematiksel işlem yapılırken bash veya diğer shell'lerde 4 işlem bile mümkün değil. Ama çözümü var: bc

bc yazıp giriş yaptığımızda etkileşimli bir ortam karşılıyor bizi. Çıkmak için quit yazmak gerek, exit işe yaramıyor. ctrl+c de işe yarar. Buraya girmeden basit bir şekilde sonucu öğrenmek için

echo '33*47' | bc

yazılabilir.

Başka bir yöntem dolar ($) operatöründen sonra çift parantez kullanmak ve parantezler ile ifade arasında bir karakter boşluk bırakmak:

echo $(( 33*47 ))

Trigonometrik fonksiyonlar gibi karışık işler için python kullanılabilir. Ama varsayılan shell'de math kütüphanesi gelmediği için önce import math ile kütüphaneyi eklemek gerek:

import math
math.sin(math.pi/2)

 

2025-12-12

Linux komut geçmişi

Terminalden bağlandığım bir linux sunucu var. Oluşturduğum yeni bir kullanıcı için komut geçmişi (history) yok gibi görünüyor. Bunu etkinleştirmek istiyorum.

Önce kullandığım shell'i kontrol etmem gerek.

echo $SHELL
/usr/bin/sh

ile bash'i değil, sh'i kullandığımı gördüm. Bunu değiştirerek bash yaptım.

chsh -s $(which bash)

sonra bir kez bağlantımı kesip (konsoldan bağlıysam oturumu kapatıp) tekrar oturum açmam gerek.

Sonrasında yine echo $SHELL komutunu kullanarak çıkışta /usr/bin/bash gördüm.

Komut geçmişi, profilin altında .bash_history dosyasına yazılır. Bu dosya yoksa

echo $HISTFILE

komutu ile önce bu değişkenin varlığını kontrol etmek, yoksa

export HISTFILE=~/.bash_history

satırını .bashrc dosyasına eklemek, arkasından etkinleştirmek için

source ~/.bashrc

çalıştırmak gerek.

Komut geçmişini sınırlandıran değişkenler kontrol edilebilir:

echo $HISTSIZE
echo $HISTFILESIZE

Bu değişkenlerin ilki hafızada tutulacak komut geçmişi sayısı, ikincisi diskte tutulacak geçmiş sayısıdır.

zsh için de benzer bir şekilde ~/.zsh_history dosyasında tutulur. HISTSIZE değişkeni aynen geçerlidir, HISTFILESIZE yerine SAVEHIST değişkeni kullanılır.

Daha iyi bir yöntem için audit kullanılabilir. 

2025-02-22

bash prompt'a en son komut çalışma süresini eklemek

bash promptumda en son çalışan komutun ne kadar süre ile çalıştığını gösteren bir alan olmasını istiyorum. Bu işi doğrudan yapmanın bir yönteminin olmadığını öğrendim. Ama dolaylı olarak yapmanın yolları var. trap ve PROMPT_COMMAND gibi yönergeler işe yarıyor. Yazdığımız komutu çalıştırmadan hemen önce çalışacak fonkisyonu trap ile bildiriyoruz. Promptu oluşturacak fonksiyonu işe PROMPT_COMMAND yönergesi ile belirliyoruz. Örneğin preexec adında bir fonksiyon oluşturup içeriğini şöyle belirledim.

function preexec() {
    export TIMER_START=(date +%s%3N)
}

Bu fonksiyon, TIMER_START adında bir değişken oluşturup, içeriğini 01.01.1970'ten bu yana geçen milisaniyelere eşiytleyecek. Sonra da precmd adında bir fonksiyon oluşturup içeriğini aşağıdaki gibi belirledim.

function precmd() {
local TIMER_END=(date +%s%3N)
local TIME_DIFF=$((TIMER_END-TIMER_START))
if (( TIME_DIFF > 1000 )); then
local DURATION="$((TIME_DIFF / 1000)) s"
else
local DURATION="$TIME_DIFF ms"
fi
export PS1="($DURATION) $ "
}

Bundan sonra preexec'i trap ile, precmd'yi de PROMPT_COMMAND ile belirliyorum.

trap 'preexec' DEBUG 
PROMPT_COMMAND=precmd

Ancak bundan sonra farkettim ki preexec fonksiyonu birden fazla işliyor. Benim tespit ettiğim bir kez komutu çalıştırmadan önce, bir kez de komutu çalıştırdıktan sonra. Bu ilginç bir konu ama derinlerine dalmak istemedim. Basit bir şekilde bir komut için sadece 1 kez çalıştırılmasını bir değişkenle denetledim.

preexec_active=0
function preexec() {
    if [[ $preexec_active -eq 0 ]]; then
    export TIMER_START=(date +%s%3N)
    preexec_active=1
    fi
}

Benzer şekilde precmd fonksiyonunun içine de bu değişkeni eski haline döndürecek bir satır ekledim.

function precmd() {
    local TIMER_END=(date +%s%3N)
   local TIME_DIFF=$((TIMER_END-TIMER_START))
    if (( TIME_DIFF > 1000 )); then
        local DURATION="$TIME_DIFF s"
   else
        local DURATION="$TIME_DIFF ms"
   fi
   export PS1="($DURATION) $ "
    preexec_active=0
}

Bu şekilde herşey istediğim gibi oldu.

2020-10-13

Linux'ta standart akışları yönlendirme

Bir komut satırı uygulaması için 3 temel akış (stream) söz konusu:

0: Giriş için stdin, 
1: çıkış için stdout,
2: hata çıktıları için stderr.

Bir uygulamanın konsolda çalıştığı düşünülerek, bazı giriş ve çıkışlarının olduğu varsayılır. stdin olarak isimlendirilen giriş, klavyedir. Program çıktısını stdout'a yani ekrana basar. Olası hata durumlarında ekrana bazı hata mesajları da basılır ama genellikle hata mesajlarının normal stdout çıktısınıdan ayrı olması istendiği için onun akışı ayrıdır, stderr olarak adlandırılır.

stdin yönlendirmesi

Tüm girişin klavyeden değil de, bir programın çıktısından ya da bir dosyadan olması gereken durumlarda kullanılır.

$ head < dosya.txt

Yönlendirme operatörü olarak "<"  kullanıldı.

stdout yönlendirmesi

Genelde bir komutun planlanan tüm çıktılarını başka bir komuta veya dosyaya yönlendirmek için kullanılır.

$ ls -ld */  | wc -l # tüm klasörleri say

$ last -s 2019-05-01 | awk '{print $1}' #tarihten sonra yeniden başlatan kullanıcıları isimleri

$ find . -iname "*.txt" -newermt "5 months ago" -ls > new_txt_files.log # son 5 ayda değiştirilen dosyaların listesini new_txt_files.log'a yaz

Burada > operatörünün yanında boru "|" operatörünün de kullanıldığına dikkat.

stderr yönlendirmesi

3 klasörün içeriklerini bir dosyaya yazdığımızı düşünelim. Ama üçüncü klasör var olmayan bir yolu gösteriyor.

$ ls Belgeler Resimler Filmler > dosya_listesi.txt

Bu komut Belgeler ve Resimler klasörünün çıktısını belirtilen dosya_listesi.txt dosyasına yazarken, Filmler klasorunun var olmadığına dair hatayı sadece ekrana yazar ve dosya_listesi.txt dosyasına bir mesaj yazmaz. Bunun sebebi, hata çıktısının farklı bir kanaldan gönderilmesidir. İki seçeneğimiz var. Ya stderr akışını hata.txt dosyası gibi bir dosyaya yazabilir, ya da hataları da dosya_listesi.txt dosyasına atabiliriz. İlk durum için komudumuz şöyle olabilir:

$ ls Belgeler Resimler Filmler 2> hata.txt 1> dosya_listesi.txt

İkinci durum için komudumuz şöyle olabilirdi:

$ ls Belgeler Resimler Filmler > dosya_listesi.txt 2>&1

Burada sonda yer alan 2 numaralı stderr akışını &1'e yönlendirme bölümünün stdout'un dosya_listesi.txt'ye yönlendirmesi (> dosya_listesi.tx) bölümünden sonra olması önemli. Eğer sıra değişirse sadede stdout dosyaya yazılır (çünkü stderr > stdout yönlendirmesi sırasında stdout dosyaya yönlendirilmemiş olur)

Alternatif olarak bash'e özel &> kısaltması (2>&1 ile aynı anlama gelir) kullanılabilir:

$  ls Belgeler Resimler Filmler &> dosya_listesi.txt

---

[1] https://linuxize.com/post/bash-redirect-stderr-stdout/

[2] https://linuxhandbook.com/redirection-linux/

[3] https://www.guru99.com/linux-redirection.html

[4] https://www.putorius.net/linux-io-file-descriptors-and-redirection.html

[5] https://linuxconfig.org/bash-scripting-tutorial-for-beginners

2019-09-16

Linux komut satırı araçları

uptime
Bilgisayar ne kadar süredir açık görmek için. Yanında ek bilgiler de var.
$ uptime
16:07:00 up 50 min,  1 user,  load average: 0,05, 0,02, 0,00
Burada mavi ile verilen ilk bölüm mevcut yerel saati gösteriyor. Kırmızı ile verilen ikinci bölüm ne kadar süredir açık olduğunu, sonraki yeşil bölüm kaç kullanıcının oturum açtığını, en son turuncu bölüm ise son 1, 5 ve 10 dakikalık zaman dilimindeki iş yükü ortalamasını gösteriyor, yüzdesel olarak.

Üçüncü bölümde yeşil olarak verilen şu anda oturum açmış kullanıcıların kimler olduğunu görmek için kullanılabilecek birkaç komut var. İlki en basit şekliyle kaç kullanıcının ne zaman oturum açtığını gösteren who:
$ who
usern    tty1         2019-09-08 21:43 (:0)
Bu komuttan biraz daha fazla bilgi veren w komutu var, bir miktar uptime ile birleştirilmiş who gibi:
$ w
21:59:28 up 16 min,  1 users,  load average: 0,79, 1,00, 0,78
USER     TTY       LOGIN@   IDLE   JCPU   PCPU   WHAT
usern    tty1      21:43    16:18  1:02   0.02s  /bin/bash
Ya da ps komutunu u parameteresiyle kullanabiliriz. Bunun avantajı, eğer oturumunu sonlandırmayı istediğimiz bir kullanıcı varsa bu komut aracılığıyla PID sütunundaki kimlik numarası kullanarak yapabiliriz.
$ ps u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
usern      1447  0.0  0.0  10444  4524 pts/2    Ss   21:43   0:00 /bin/bash
Örneğin tek kullanıcımız usern'in oturumunu
$ kill 1447
ile sonlandırabiliriz.

last
Bilgisayar ilk kurulduğu günden beri açılış ve oturum açma işlemlerini listeler.
$ last
usern    tty1         :0               Fri Sep  6 15:18   still logged in
usern    :0                            Fri Sep  6 15:18   still logged in
reboot   system boot  5.2.5-200.fc30.x Fri Sep  6 15:16   still running
usern    tty1         :0               Thu Aug  8 16:16 - 18:03  (01:46)
usern    :0                            Thu Aug  8 16:16 - down   (01:48)
reboot   system boot  5.1.18-300.fc30. Thu Aug  8 16:05 - 18:05  (02:00)
Çok geriye gitmeden son birkaç satırı aldım. İşletim sisteminin açılışı reboot ile başlayan satırlarda belirtiliyor:
reboot   system boot  5.2.5-200.fc30.x Fri Sep  6 15:16   still running
Bu gibi satırlarda 2. sütunda hep system boot yazıyor. 3. sütunda ise yükleme işleminden sorumlu çekirdek sürüm numarası var. Son sütunda ise sistemin açılış tarihi ve saati ile kapanış saati ve parantez içinde de sistemin açık kalma süresi var.

Kullanıcı adıyla (usern) başlayan satırlar kullanıcının şifresini girerek oturum açması ile ilgili olan satırlar.
usern    :0                            Fri Sep  6 15:18   still logged in
Burada tty1 (veya genel olarak tty*) yerel olarak terminal etkileşimini, pts0 (veya pts*) uzaktan ssh gibi yöntemlerle terminal etkileşimini gösterir. Bu satırların sonunda ise kullanıcının oturumu açık olarak kaldığı süre gösterilir.

Sadece sistemin başlatma olaylarını listelemek için
$ last reboot
sadece belli bir kullanıcının oturum açma olaylarını listelemek için de
$ last usern
Kapanma olaylarını ve çalışma seviyesi (runlevel) değişikliklerini görebilmek için -x kullanılır.
$ last -x
kullanılabilir. Belli bir tarihten sonra gerçekleşen olayların listesi için -s anahtarı (since), bir tarihe kadar olan bir olayları görmek için -t (until) veya son 10 sayıda olayı görmek için -n 10 gibi anahtarlar kullanılabilir.
$ last -s 2019-03-01 -t 2019-05-31
$ last -n 10
Belirtilen bir tarihteki olayları görmek için -p (present)
$ last -p 2019-05-19
awk
Çok faydalı bir araç. İsmini geliştiricilerinin soyisimlerinin başharflerinden alıyor. Örneğin last komutu ile 01.05.2019 tarihinden sonra kimler giriş yapmış, kullanıcı adlarını görüntülemek için şöyle bir komut kullanılabilir:
$ last -s 2019-05-01 | awk '{print $1}'
reboot yazılan satırlar sistem açılışları, gerçek kullanıcı değil. Varsayılan olarak boşluk karakterlerini alan ayraçı olarak kullanır. Bunu değiştirmek için -F anahtarı kullanılır. Örneğin /etc/passwd dosyasındaki kullanıcı isimlerini ve tire "-" karakteri ile ayrılan açıklamalarını yazmak için şöyle bir komut kullanılabilir:
$ awk -F: '{print $1 " - " $5}' /etc/passwd
Örnek olarak aşağıdaki gibi notlar.txt dosyamız olsun.

Arda 80
Batu 60
Deniz 40
Caner 30

Bu verilere göre 50 geçer notun üzerinde not alan öğrencilerin geçtiğini açıklamak istiyoruz. Şöyle bir satır işimizi görür:
$ awk '{if ($2>50) print $1 " geçti"}' notlar.txt
Arda geçti
Batu geçti
Bir sonraki aşama, notlar.txt dosyasında her satırda isim ve 2 sınav notu yer alıyor.

Arda 80 60
Batu 60 70
Deniz 40 80
Caner 30 50


Bu 2 notun ortalamasını ekrana yazmak istiyoruz.
$ awk '{
total = 0
for (i=2; i<4; i++)
{ total += $i }
avg = total/(i-2)
print $1 ": " avg
}' notlar.txt
Şöyle bir sonuç verecek:

Arda: 70
Batu: 65
Deniz: 60
Caner: 40


Notlar dosyasında sadece Deniz'in ilk sınav notunu merak ettik diyelim. Bunu yapmanın başka yolları var elbette, ama awk örneği olsun diye böyle yapalım.
$ awk ' /'Deniz'/ {print $2}' notlar.txt
40
Başka bir örnek; adı sayilar.txt ve her satırında 10, 20, 30 ve 40 olan bir metin dosyasındaki tüm sayıların toplamını hesaplamak için
cat sayilar.txt | awk '{toplam+=$1} END {print toplam}' 
Veya kısa bir oran hesaplaması yapmak için
cat sayilar.txt | awk 'BEGIN {adet=0} {toplam+=$1; adet++} END {print toplam " / " adet " = " toplam/adet}'
Daha fazla ayrıntı için [1] ve [2] ye bakılabilir.

sed
Stream EDitor kısaltması. Bu aracın da ilginç kullanım alanları var. Örneğin bir dosyamız olsun, aşağıdaki gibi.

Bu birinci satır
Sonra gelir ikinci
Sondan bir önceki üçüncü
En sonda da dördüncü

Bu dosyanın örneğin 2. satırını silmek istiyoruz
$ sed '2d' ornek.txt
Bu birinci satır
Sondan bir önceki üçüncü
En sonda da dördüncü
Ya da en son satırını
$ sed '$d' ornek.txt
Bu birinci satır
Sonra gelir ikinci
Sondan bir önceki üçüncü
2. ve 4. satırlar arasını da silebiliriz
$ sed '2,4d' ornek.txt
Bu birinci satır
Dosyanın sadece 2. satırını yazdırmak istersek
$ sed -n 2p ornek.txt
Sonra gelir ikinci
Dosyanın içinde "önceki" kelimesini "evvelki" ile değiştirmek için
$ sed 's/önceki/evvelki/' ornek.txt
Bu birinci satır
Sonra gelir ikinci
Sondan bir evvelki üçüncü
En sonda da dördüncü

Eğer son kesmeden sonra bir sayı gelmiyorsa sadece ilk görülen "önceki" kelimesi "evvelki" ile değiştirilir. En son kesme işaretinden sonra bir sayı geliyorsa, örneğin 2, "önceki" kelimesinin sadece 2. tekrarını "evvelki" ile değiştirir. Eğer kesmeden sonra g geliyorsa tüm tekrarlar değiştirilir.

Bir dosyanın içindeki boşluk karakterlerini yeni satır (carriage return) karakteriyle değiştirmek için

$ sed s/" "/\\n/g ornek.txt

Tüm satırların öncesinde satır numaralarını yazmak için '=' kullanılır (ki bunun alternatifi cat -n dir)

$ sed '=' ornek.txt
1
Bu birinci satır
2
Sonra gelir ikinci

3
Sondan bir önceki üçüncü

4
En sonda da dördüncü
İkinci satırın içeriğini tümüyle değiştirmek istersek
$ sed '3c\BURASI ÜÇÜNCÜ SATIR' ornek.txt
Bu birinci satır
Sonra gelir ikinci
BURASI ÜÇÜNCÜ SATIR
En sonda da dördüncü
Birkaç karakteri değiştirmek:
$ sed 'y/ioü/104/' ornek.txt
B1r1nc1 satır
S0nra gel1r 1k1nc1
S0ndan b1r öncek1 4ç4nc4
En s0nda da dörd4nc4

cut

Bu da çok yetenekli bir metin aracı. Aşağıdaki farazi personel.txt dosyası üzerinden birkaç örnek yapalım.
 
personel.txt
Mazhar Alonson 1950 Ankara
Fuat Güner 1948 İstanbul
Özkan Uğur 1953 İstanbul
 
Bu dosyada boşluk karakteriyle ayrılmış bazı alanlar var; isim, soyisim, doğum yılı, doğum yeri.
 
Sadece isim ve doğu yılını almak için
 
$ cut -d " " -f 1,3 personel.txt
Mazhar 1950
Fuat 1948
Özkan 1953
 
Her satırdan sadece ilk 3 karakteri (byte) almak için
 
$ cut -b 1,3 personel.txt
Maz
Fua
Özk 

-b (byte) ve -c (character) komutlarının farkını göremedim. İkisi de belli sayıda karakter veya byte okumak için kullanılıyor. -d "AYRAÇ" ile alan ayracı belirtilebiliyor. Varsayılan ayraç TAB. -f ile ayrılan alanlardan istenilen numaralı olan (indeksleme 1'den başlıyor) seçilebiliyor.

Bazı ls parametreleri
Bulunduğumuz klasördeki sadece klasörleri görüntülemek için

$ ls -ld */

Listelemede önce klasör isimlerini görmek için
$ ls --group-directories-first

Bir klasörde yer alan dosyaları en son değiştirilme tarihine göre listelemek istersek:
$ ls -lt
kullanabiliriz. Bu şekilde en yeniler en üstte yer alır. Sıralamayı tersine çevirmek için -r (reverse) anahtarını eklemek gerek:
$ ls -ltr
Bunu bütün alt klasörler için yapmak istesek -R anahtarını kullanmak gerek (büyük/küçük harf hassasiyetine dikkat!):
$ ls -ltR

Klasördeki dosyaları boyutlarına göre sıralamak için -S (varsayılan olarak büyükten küçüğe) anahtarı kullanılır:

$ ls -lS | head -5

ile mevcut klasördeki en büyük 5 dosyayı görebiliriz. 

Bir sürecin başlama zamanını ve açık kalma süresini görmek için aşağıdaki komut kullanılabilir [8]:

# ps -eo comm,lstart,etime,user | grep firefox

En çok işlemci kullanan 3 uygulamayı görmek için

# ps -e –sort=-pcpu -o pid,pcpu,comm | head -n 4

Aynı şekilde en çok bellek kullanan 3 uygulamayı görmek için

# ps -e –sort=-pmem -o pid,pmem,comm | head -n 4

find

Bir klasör ve alt klasörlerinde son 24 saatte değişen dosyaları ve klasörleri bulabilmek için şu komut kullanılabilir:

$ find /klasor -mtime -1 -ls
Burada -1 son 24 saat içinde değişenler demek. +1 kullansaydık son 24 saatten önce değişenler anlamına gelecekti. Ayrıca şunun gibi "daha insani" yollar da önerilmiş:
$ find /klasor -newermt "-24 hours" -ls
$ find /klasor -newermt "5 days ago" -ls
$ find /klasor -newermt "yesterday" -ls
Daha iyi bir çıktı için:
$ find /klasor -mtime 0 -printf '%T+\t%s\t%p\n' 2>/dev/null | sort -r | more

gibi bir komuttan bahsedilmiş ki burada dosyalar son değiştirilme tarihi ile listelenecek, bu tarihe göre sıralanacak ve sayfalanacak. Sadece dosyaları görmek istersek -type f ile listelenecek öğe tipini dosya (f) olarak kısıtlayabiliriz. Burada -prinf sonrasındaki alanlar şöyle verilmiş:

%T : Dosyanın son değiştirilme tarihi (yerel saatte)

%s : Byte olarak dosya boyutu

%p : Dosya adı

aralardaki \t tab karakteri, \n ise tahmin edilebileceği gibi yeni satır karakteri.

Bir klasör ve alt klasörleri içinde son 6 ay içinde üzerinde değişiklik yapılmamış dosyaları silmek için

find /hedef -type f -mtime +180 -exec rm -f {} \+

Burada
-type f : sadece dosyaları hedef al
-mtime +180: değiştirilme tarihi 180 günden önce (-180 olsaydı 180 günden sonra olurdu)
-exec rm -f {} : bulunan her öğe için rm (remove) komutunu çalıştır, bunu -f ile (force) destekle
\+ : bunları tek bir satırda toplayarak rm -f dosya1 dosya2 ... dosyaN şeklinde çalıştır
\; olsaydı bu her bir exec işlemini ayrı ayrı yap anlamına gelecekti (rm -f dosya1, rm -f dosya2, .... gibi). Burada \ escape karakteri.

Bir klasörün altındaki tüm boş dosyaları bulmak için

    $ find . -type f -empty

Hatta boş klasörler için

    $ find . -type d -empty

Veya 2 KB'tan büyük dosyaları bulmak için

    $ find . -type f -size +2K

Bir kullanıcının sahip olduğu dosyaları aramak için

    $ find . -user metin
 
lsof (list open files)
Açık dosyaları sorgulamak çoğu durumda çok faydalı olabilir. Hiçbir parametre olmaksızın aşağıdaki gibi bir çıktı üretir.
# lsof
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1               root cwd DIR 8,3       4096     2 /
systemd 1               root rtd DIR 8,3       4096     2 /
systemd 1               root txt REG 8,3    1640496 14161 /usr/lib/systemd/systemd


Çıkışta geçen FD dosya tanımlayıcısıdır (file descriptor) ve şu değerleri alabilir:
cwd: şimdi bulunulan klasör (current working directory)
rtd : root'un klasörü, yani /root (root directory)
txt : program metni
mem : memory mapped file
r: bir sayı eşliğinde geçen r okuma (read) kipinde açılmış dosyayı gösterir
w: bir sayı eşliğinde geçen w yazma (write) kipinde açılmış dosyayı gösterir
u: yine bir sayı eşliğinde geçer ve yazma ve okuma modunda açılmış dosyayı gösterir
 
TYPE alanı dosya tipini gösterir şu değerleri alabilir:
REG: normal dosya (regular file)
DIR: klasör (directory)
CHR: karakter tipi cihaz (character special file)
FIFO: ilk giren ilk çıkar tipi yapı (first in first out)

Birkaç örnek üzerinden gidelim.

Belli bir kullanıcı tarafından açılan dosyaların listesini almak için
# lsof -u metin
hatta bu kullanıcının açtığı tüm süreçleri sonlandırmak için
# kill -9 `lsof -t -u metin`
veya belli bir kullanıcıyı hariç tutmak için
# lsof -u^root
Ağ bağlantıları içinde dinleme durumunda (listening) ve kurulmuş (established) bağlantıları görmek için
# lsof -i
TCP 25 portunu kullananlar
# lsof -i TCP:25
Protokol farketmeksizin 53 portunu kullanan uygulamalar için
# lsof -i :53
Sadece IPv4 bağlantıları listelemek için
# lsof -i 4
PID'si 1135 olan süreç tarafından açılan dosyaları görmek için
# lsof -p 1135
/var/log/clamav/freshclam.log dosyasını açan prosesi bulmak için
# lsof /var/log/clamav/freshclam.log
/var/log klasöründeki dosyalarla ilgileniyorsak
# lsof +D /var/log

du (disk usage)
Komut satırında çalışırken bir klasörün alt klasörleri ile birlikte diskte ne kadar yer kapladığını bulmak için bu komut ideal. Örneğin Fedora'nın dnf yerel önbelleğinde tutulan dosyaların boyutunu öğrenmek için

$ sudo du -sh /var/cache/dnf/
kullanabiliriz. Burada

-s : tek satırda tüm alt klasörlerle boyutu yaz
-h : byte cinsinden değil, otomatik olarak hangi ölçekteyse KB, MB veya GB cinsinden yaz.

Faydalı bir anahtarı daha var; örneğin tmp uzantılı dosyalar hariç boyutu görmek istiyorsak --exclude="*.tmp" yazabiliriz. 
Bunun sonucunda görülecek sayı dosya yöneticisi ile bakıldığında görülecek sayı ile bir olmayabilir. Bunun sebebi du'nun dosyanın diskte kapladığı yeri göstermesi, dosya yöneticisinin ise dosyaların toplam boyutlarını göstermesidir (aradaki fark; 300 byte'lık bir dosya diskte asgari bir blocksize yer kaplar ki o da muhtemelen 4KB'dır. Sizinkini görmek için blocksize --getbsz /dev/sdaX). Bu durumda dosya yöneticisinin verilerini doğrulamak için
$ find /var/cache/dnf/ -type f -exec ls -l {} \; | awk '{toplam+=$1} END {print toplam}'
kullanılabilir. Bu byte cinsinden verir. du -h anahtarı ile bunu MB veya duruma göre GB cinsinden gösterebilir.

df
Dosya sistemi kullanım oranlarını gösterir. Hiçbir parametre kullanmadan çalıştırınca tüm dosya sistemlerini listeler. Listelenen dosya sistemi türlerini de ayrı bir sütunda görmek için -T anahtarı kullanılabilir.

$ df -T
Dosyasistemi                            Tür       1K-blok     Dolu      Boş Kull% Bağlanılan yer
devtmpfs                                devtmpfs   469808        0   469808    0% /dev
tmpfs                                   tmpfs      488044        0   488044    0% /dev/shm
tmpfs                                   tmpfs      488044     1284   486760    1% /run
/dev/mapper/fedora_localhost--live-root ext4     37868960 10927560 24988020   31% /
tmpfs                                   tmpfs      488044      164   487880    1% /tmp
/dev/sda1                               ext4       999320   235008   695500   26% /boot
tmpfs                                   tmpfs       97608       36    97572    1% /run/user/1000


Listelenecek dosya sistemlerini dosya sistemi türüne göre sınırlandırmak için -t anahtarı ve sonrasında dosya sistemi tipi kullanılabilir:

$ df -t ext4
Dosyasistemi                             1K-blok     Dolu      Boş Kull% Bağlanılan yer
/dev/mapper/fedora_localhost--live-root 37868960 10927560 24988020   31% /
/dev/sda1                                 999320   235008   695500   26% /boot


Veya tam tersi olarak bir dosya sistemini hariç tutarak listelemek için -x ve sonrasında dosya sistemi tipi kullanılabilir.

$ df -T -x tmpfs
Dosyasistemi                            Tür       1K-blok     Dolu      Boş Kull% Bağlanılan yer
devtmpfs                                devtmpfs   469808        0   469808    0% /dev
/dev/mapper/fedora_localhost--live-root ext4     37868960 10927584 24987996   31% /
/dev/sda1                               ext4       999320   235008   695500   26% /boot


less
Bir komutun çıktısını sayfalayarak göstermeye yarayan more komutuna benzer yapıda çalışıyor. Bu komutla ilgili çok sık yapılan bir espri var: "The less is more, more or less". More'a göre daha işlevsel. Kısayollar şöyle:


Kısayol Tuşu
İşlevi
aşağı ok, enter, e, veya j Bir satır aşağı
yukarı ok, y, veya k Bir satır yukarı
boşluk çubuğu
Bir sayfa aşağı
b Bir sayfa yukarı
sağ ok
Yatay sağa kay
sol ok
Yatay sola kay
g İlk satıra git
G Son satıra git
10g 10. satıra git. Farklı sayıla ile istenen satıra gidilebilir
50p veya 50% Tam ortaya (veya başka bir sayı verilerek istenen yüzdelik noktaya) git
/search terim Şu anki noktadan aşağıya doğru terimi ara
?search terim Şu anki noktadan yukarıya doğru terimi ara
n Arama sırasında bir sonraki bulunan noktaya git
N Arama sırasındaki bir önceki bulunan noktaya git
m<c> m'den sonra herhangi bir karakter girerek şu anki konumu işaretle
'<c> Tek tırnak tuşu ile yukarıdaki gibi işaretlenen noktaya git   
q çıkış yap


---
[1] https://likegeeks.com/awk-command/
[2] https://linuxconfig.org/learning-linux-commands-awk
[3] https://www.geeksforgeeks.org/sed-command-in-linux-unix-with-examples/
[4] https://www.linuxtechi.com/20-sed-command-examples-linux-users/
[5] https://likegeeks.com/sed-linux/
[6] https://www.howtogeek.com/562941/how-to-use-the-awk-command-on-linux/ 
[7] https://www.linuxteck.com/find-command-in-linux-with-examples/
[8] https://www.linuxteck.com/ps-command-in-linux-with-examples/
[9] https://medium.com/techtofreedom/8-uses-of-sed-in-linux-e61678b04114

[10] https://medium.com/@hicransevik/some-text-processing-tools-aaac89e89a16

2019-04-26

pureline

Renksiz bir linux terminali yerine daha renkli bir terminal elde etme yolundaki ilk çalışmamın ardından Reddit'te şu gönderi ilginç geldi.

Daha önce PowerLine'ı denemiştim, ama amaca göre biraz aşırı doz izlenimi yarattığı için çok ilgimi çekmemişti. Pureline daha sade. Hoşuma gitti. Github sayfasında bazı şeyler anlatılmış, ama biraz daha açıklama fena olmaz herhalde.

Profil klasörümün altında github repo'sunun kopyasını yarattım:

# git clone https://github.com/chris-marsh/pureline

Bu şekilde ~/pureline klasörü yaratıldı, ve altına ilgili dosyalar indirildi. Bu klasörün altında bir de configs diye bir alt klasör var. Burada örnek bazı yapılandırmalar verilmiş. Bunlardan en fazla göstergesi (ya da modül) olan powerline_full_256col.conf dosyasını profilimin altına kopyaladım.

# cp ~/pureline/configs/powerline_full_256col.conf ~/.pureline.conf

Daha sonra da Github sayfasında önerilen, .bashrc ya da .profile dosyasına şu satırları eklemek:

if [ "$TERM" != "linux" ]; then
    source ~/pureline/pureline ~/.pureline.conf
fi


Bundan sonra eğer açıksa terminali kapatıp yeniden açmak lazım. Şu şekilde bir terminal görünecektir:


Burada gözüken göstergeleri (modülleri) değiştirmek/düzenlemek için ~/.pureline.conf dosyasıın açmak gerek. Her göstergenin ~/pureline/pureline dosyası içinde bir fonksiyonu var. ~/.pureline.conf içinde ise şu bölüm altında kullanılan göstergeler belirleniyor:

# All modules are enabled. Uncomment/comment to enable/disable a module
declare -a PL_MODULES=(
    # Module                Background  Foreground
    'time_module            MyLightGrey Black'
    'battery_module         MyBlue      Black'
    'user_module            MyLime      Black'
    'ssh_module             MyYellow    Black'
    'virtual_env_module     MyBlue      Black'
    'path_module            MyBlue      Black'
    'read_only_module       MyRed       White'
    'background_jobs_module MyPurple    White'
    'git_module             MyGreen     Black'
    'return_code_module     MyRed       White'
    'newline_module'
    'prompt_module          MyDarkGrey  White'
)


İlk sütun dosyadaki fonksiyon ismi. İkinci sütun göstegenin fon rengi, üçüncü sütun ise font rengi. Örneğin terminalde zamanı yazdığımız bölüm için fon rengi MyLightGrey, yazı rengi olarak da Black kullanılmış. Bu satırın baştan sona tek tırnak arasında yazıldığına dikkat!

İstenmeen modüller çıkartılıp, yerleri değiştirilebilir, hatta yenileri yazılabilir.

2019-01-09

Linux terminali özelleştirmek

Linux'ta vakit geçirdikçe Windows'un komut satırı pek bi sıradan gözüküyor insanın gözüne. Ama buna çare yok (ya da çare cmder!)


Yukarıda Fedora ile gelen standart terminal penceresi. Renklendirme yok, prompt standart. Biraz kendime göre özelleştirmeye çalıştım. Bunun sonuçlarında da şöyle bir sonuca ulaştım:


Biraz renklendirilmiş, saat ve geçmiş bilgisi eklenmiş. Bu sonuca nasıl vardığımı kısaca anlatayım.

Öncelikle prompt satırında "[" ve "]" arasında yazılmış 3 alan var. Birinci alan varsayılan haliyle

[metin@ozm-fed ~]

kısmı. Burada kullanıcı adı ve bilgisayar adını, sonrasında da bulunduğumuz klasör adını görüyoruz. Bunu kodlamak için

[\u@\h \w]

kullandım.

İkinci kısım ise saati gösteriyor. Bunun için de

[\A]

kullandım.

Üçüncü kısım ise komut geçmişindeki mevcut indeksi gösteriyor. Bunun içinse

[\h]

kullandım. Son prompt karakteri olarak \$ aşikar. Tüm bunları birleştirince şöyle bir dizi çıkıyor:

"[\u@\h \w] [\A] [\h] \$"

Ancak bu renklendirilmemiş hali. Renklendirme işi ise başka bir dünya. Renk kodları vermek için escape karakteri kullanmak gerek. Escape karakteri başlangıcı \[ ile, bitişi ise \] ile belirtiliyor. Renk kodları ise \e[ ile başlayan ve m ile bitecek şekilde belirtiliyor. Garip ama böyle.

Renk kodları şöyle:
  • 30: Siyah
  • 31: Kırmızı
  • 32: Yeşil
  • 33: Sarı
  • 34: Mavi
  • 35: Mor
  • 36: Camgöbeği
  • 37: Beyaz
Ayrıca bir de biçem kodları var:

  • 0: Normal metin
  • 1: Kalın veya ince, terminale göre değişir
  • 4: Altı çizili
Fon rengi kodları da şöyle:
  • 40: Siyah fon
  • 41: Kırmızı fon
  • 42: Yeşil fon
  • 43: Sarı fon
  • 44: Mavi fon
  • 45: Mor fon
  • 46: Camgöbeği fon
  • 47: Beyaz fon

Nihayet sarı bir kullanıcı adı yazmak için şu kodlama gerek:

\[\e[0;33m\]\h

Sarı ile vurgulanan alan sadece \h ile belirtilen kullanıcı adını düz metin (0) ve sarı renk (33) ile yazmak içindi. Eğer bir de arka fon rengi belirtmek istiyorsak 0'dan önce de onu yazmamız gerekecekti, yine noktalı virgille ayırarak. Aşağıda örneği var. Kullanıcı adını sarı ile yazdıktan sonra tekrar @ karakterini varsayılan renkte yazması için sıfırlamak gerek. Bunun için de

\[\e[0m\]

kullanılır. Bu şekilde tüm promptu oluşturmak için şöyle bir kodlama gerekti:

[\[\e[0;33m\]\u\[\e[0m\]@\[\e[0;31m\]\h\[\e[0m\] \w] [\[\e[0;34m\]\A\[\e[0m\]] [\[\e[0;32m\]h:\!\[\e[0m\]] \[\e[43;1;37m\]$\[\e[0m\]

Şu renk kodlamasıyla ayrılan bölüm prompt karakterini sarı fon üzerine beyaz olarak yazmak içindi.

Bu karakter dizisini PS1 adlı bir ortam değişkenine atarak etkin kılabiliriz. Bunu her yeni terminal penceresinde kullanabilmek için ise profil klasörümüzdeki .bashrc dosyasının içine

PS1="[\[\e[0;33m\]\u\[\e[0m\]@\[\e[0;31m\]\h\[\e[0m\] \w] [\[\e[0;34m\]\A\[\e[0m\]] [\[\e[0;32m\]h:\!\[\e[0m\]] \[\e[43;1;33m\]\$\[\e[0m\] "

gibi bir satır ekleyerek yapabiliriz.

ls komutunun renkli çıktı üretmesi için .bashrc dosyasının içine bir alias eklenebilir:

export ls='ls --color=ALWAYS'

Burada, Manjaro için ls= den sonra gelen kısmın tek tırnak içinde olmasına, color'dan sonra iki nokta üstüste değil eşittir kullanılmasına ve ALWAYS'sin büyük harflerle yazılmasına dikkat etmek gerek. Fedora için ise always küçük harflerle yazılmalı.

Ya da ls komutunda gösterilen tarih ve saat biçimini değiştirmek için Manjaro için yine .bashrc'de aşağıdaki gibi bir ortam değişkeni tanımlanabilir:

export SYSTEM_TIME=long-iso

Fedora için ise ls komutu parametresi --time-style=long-iso kullanılabilir. Yukarıdakiyle birleştirildiğinde toplu alias şöyle olabilir:

alias ls='ls --color=always --time-style=long-iso'

2021-12-20 düzenleme: Aşağıdaki bash değişkenlerini tanımlayarak işimizi kolaylaştırabiliriz.

Sari_Siyah = "\[\e[0;33m\]"
Kirmizi_Siyah = "\[\e[0;31m\]"
Mavi_Siyah = "\[\e[0;34m\]"
Yesil_Siyah = "\[\e[0;32m\]"
Sari_Sari = "\[\e[43;1;37m\]"
Sifirla = "\[\e[0m\]"
Kullanici = "${Sari_Siyah}\u${Sifirla}"
Makine = "${Kirmizi_Siyah}\h${Sifirla}"
Konum = "${Kirmizi_Siyah}\w${Sifirla}"
Saat = "${Mavi_Siyah}\A${Sifirla}"
Gecmis = "${Yesil_Siyah}h:\!${Sifirla}"
Prmpt = "${Sari_Sari}\$${Sifirla}"
PS1 = "[${Kullanici}@${Makine} ${Konum}] [${Saat}] [${Gecmis}] ${Prmpt}"


Ya da direk hazır kodlanmışı alıp kopyalayabiliriz.
 
2023-01-02: Hiç uğraşmadan yapmak için https://ezprompt.net/ süper!

2025-02-15 Ek:

# Function to calculate and display command duration
function preexec() {
    TIMER_START=$(date +%s%N)
}

function precmd() {
    # Calculate duration in seconds and milliseconds
    if [ -n "$TIMER_START" ]; then
        TIMER_END=$(date +%s%N)
        DURATION=$(( (TIMER_END - TIMER_START) / 1000000 ))  # Convert nanoseconds to milliseconds
        if (( DURATION > 1000 )); then
            DURATION_DISPLAY="$((DURATION / 1000))s"
        else
            DURATION_DISPLAY="${DURATION}ms"
        fi
    else
        DURATION_DISPLAY="0ms"
    fi
}

PROMPT_COMMAND=precmd

# Function to set the prompt
function set_prompt() {
    local term_width=$(tput cols)  # Get terminal width

    # Left section: current working directory in blue
    local cwd="\[\e[1;34m\]\w\[\e[0m\]"

    # Right section: date and time in green
    local datetime="$(date +'%Y-%m-%d %H:%M:%S')"
    local datetime_length=${#datetime}

    # Calculate padding to right-align the date and time
    local padding=$((term_width - datetime_length))

    # Ensure the padding is valid
    if (( padding < 0 )); then
        padding=0
    fi

    # First line: Left (cwd) and right (datetime)
    PS1="${cwd}\[\e[${padding}G\]\[\e[1;32m\]${datetime}\[\e[0m\]\n"

    # Second line: Command duration + "$" prompt
    PS1+="\[\e[1;36m\]${DURATION_DISPLAY}\[\e[0m\] $ "
}

PROMPT_COMMAND="set_prompt; $PROMPT_COMMAND"
nd 'set show-all-if-ambiguous on'
bind 'TAB:menu-complete'
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
# veya
# bindkey '\e[A' history-beginning-search-backward
# bindkey '\e[B' history-beginning-search-forward 

---

[1] https://www.digitalocean.com/community/tutorials/how-to-customize-your-bash-prompt-on-a-linux-vps

[2] https://dev.to/rossijonas/how-to-set-up-history-based-autocompletion-in-zsh-k7o

 

<