23 Haziran 2020 Salı

tee komutu - stdout'a Giden Çıktıyı Dosyaya Yazar

Giriş
Açıklaması şöyle.
At its simplest, it takes data on standard input and writes that to standard output and one (or more) files.
Normalde stdout'a giden çıktıyı hem ekran hem de dosyaya yazdırmak için kullanılır. Eğer sadece şöyle yaparsak
do_something >> logfile
veya şöyle yaparsak
do_something_else > logfile
çıktı sadece dosyaya gider. Ancak hem ekrana hem de dosyaya göndermek için tee kullanılır.

Kullanım
- tee'den sonra bir dosya ismi verilir.
- Bazen tee'den sonra yeni bir pipie işareti ile tee'de çıktısını başka uygulamaya geçer

1. Komutun Çıktısı
tee komutun çıktısını pipe ile okur
Örnek
Hem stdout hem de dosyaya yazdırmak için şöyle yaparız.
$ ls -l /etc/passwd | tee logfile.txt
Örnek
Şöyle yaparız.
$ echo "hi" | tee test.txt
hi
Örnek
Şöyle yaparız.
rpm -qa | tee file | wc -l
2. Betikin Çıktısı
tee komutun çıktısını pipe ile okur

Örnek
Şöyle yaparız.
./script.sh | tee logfile.txt
Örnek
Şöyle yaparız
a-command | tee logfile.txt | myscript
Seçenekler
-a seçeneği
Açıklaması şöyle. Dosyaya ekleme (append) için kullanılır.
-a, --append  
   append to the given FILEs, do not overwrite  
Örnek
Şöyle yaparız.
do_something | tee -a logfile
Örnek
Şöyle yaparız.
./script1.sh | tee -a logfile.txt
./script2.sh | tee -a logfile.txt
Örnek
Şöyle yaparız.
( cmd | tee -a file2 ) >> file1 2>&1
-i seçeneği
Açıklaması şöyle.
-i, --ignore-interrupts  
   ignore interrupt signals   
Örnek
Elimizde şöyle bir komut olsun. ping'in çıktısını tee ala alalım ve sonra Crtl + C ile durduralım
$ ping google.com | tee log
PING google.com (74.125.131.113) 56(84) bytes of data.
64 bytes from lu-in-f113.1e100.net (74.125.131.113): icmp_seq=1 ttl=56 time=34.1 ms
...
^C
Açıklaması şöyle
Ctrl+ C causes SIGINT to be sent to all processes in the foreground process group, i.e. in this scenario all the processes in the pipeline (ping and tee). tee doesn’t catch SIGINT, so when it receives the signal, it dies, closing its end of the pipe. What happens next is a race: - if ping was still outputting, it will die with SIGPIPE before it gets the SIGINT; 
- if it gets the SIGINT before outputting anything, it will try to output its summary and die with SIGPIPE. 

In any case, there’s no longer anywhere for the output to go.
Şöyle yaparız. Böylece Ctrl + C ile tee ölmez. ping kapanır ve daha sonra da tee kapanır.
$ ping google.com | tee --ignore-interrupts log 
-help seçeneği
Açıklaması şöyle.
--help  
   display this help and exit  
--version
   output version information and exit
--output_error seçeneği
Eğer myscrip hata verirse tee çalışmayı durdurur. Bu seçenek ile myscrip hata verse bile tee çalışmaya devam eder ve çıktı logfile.txt dosyasına yazılmaya devam eder.
Örnek
Şöyle yaparız
a-command | tee --output-error=warn logfile.txt | myscript


22 Haziran 2020 Pazartesi

mount komutu

Giriş
Linux, bir çok farklı dosya sistemi ile çalışmak üzere tasarlanmıştır. Farklı dosya sistemleri işletim sistemine mount komutu ile tanıtılır.

Bazı Dosya Sistemleri
Bazı dosya sistemleri şöyle
adfs
affs
cifs
coherent
debugfs
devpts
ext
ext2
ext3
ext4
fat
hfs
hpfs
iso9660
jfs
msdos
ncpfs
nfs, nfs4
ntfs
proc
ramfs
reiserfs
romfs
squashfs
smbfs
sysv
tmpfs
ubifs
udf
ufs
umsdos
vfat
usbfs
xenix
xfs
xiafs
usbfs Dosya Sistemi yazısına bakabilirsiniz.
- Dosya sistemlerine mahsus mount komutları olabilir.
/etc/fstab Dosyası yazısına da bakılabilir.
- Ubuntu'da USB sürücüler /media dizininden erişilecek şekilde kurulur.

Kullanım
mount komutu kabaca şöyledir.
mount source_dir destination_dir
cd
Örnek
cd'yi okuyabilmek için şöyle. yaparız
mount /dev/cdrom /media/cdrom
Daha sonra bu dosya sistemine şöyle erişiriz.
ls /media/cdrom
tmpfs
tmpfs yazısına taşıdım

uzak bilgisayar
Örnek 
Başka bir bilgisayarda (ip adresi 192.168.1.1 olsun) paylaşılan dizine erişmek için şöyle yaparız.
$ mount 192.168.1.1:/data /mnt/data
seçeneksiz
Şöyle yaparız. Bilgileri gösterir.
mount 
Mount Sırası
mount komutlarında sıra önemlidir. Elimizde şöyle bir kod olsun
mount /dev/sdb1 /home
mount /dev/sdb2 /home/mythtv
Eğer şöyle yaparsak istediğimiz gibi çalışmayabilir.
mount /dev/sdb2 /home/mythtv
mount /dev/sdb1 /home
Açıklaması şöyle
If we are assuming /home/mythtv exists on the filesystem, it is gonna mount it with no problem, but after you mount the second volume you won't be able to access the first one anymore.

This is because you let the system mount sdb2 on an existing path at /home/mythtv. When you mount on /home/, you are telling your system to mount it on the /home path which also exists but is going to "cover" existing mount point. They are both mounted, but when you type cd /home/mythtv, Bash takes you to sdb1:/home/mythtv instead sdb2:/home/mythtv because they are different paths
1. --bind seçeneği
Mirror oluşturur. Belirtilen source dizin belirtilen destination dizin olarak yüklenir.

Örnek
Şöyle yaparız
sudo mount --bind /home/pandey/original /home/pandey/mirror
Örnek
Kendi meminfo dosyamızı elle yazarsak bunu mount etmek için şöyle yaparız
$ sudo mount --bind meminfo /proc/meminfo
Örnek
Açıklaması şöyle
So you want to backup all your drive without all those nasty mistakes and also filter out all the /proc and other temporary folders?

An option is to mount the root folder onto another folder within the filesystem, like this. This will give you all the files there are on your drive that are not deemed temporary (like the /proc or /sys folders).
Şöyle yaparız.
$ cd /mnt
$ mkdir drive
$ mount --bind / drive
2 -o seçeneği
options anlamına gelir.

-o loop seçeneği
iso dosyası yüklenirken kullanılır. Aslında -o loop yapmak zorunda değiliz. mount bunu kendi yapabiliyor. loop device için açıklama şöyle.
Mounts, typically, must be done on block devices. The loop driver puts a block device front-end onto your data file.
Söz dizimi şöyle. Daha sonra dosyaya /dosyayolu olarak erişiriz.
mount -o loop iso dosyaismi /dosyayolu
Örnek.
Şöyle yapsak ta olur
mount ubuntu.iso /mnt
Örnek
iso dosyası içindeki rpm'leri görmek için şöyle yaparız.
mount -o loop your.iso /mnt/cd
find /mnt/cd -type f -name '*.rpm' | wc -l
unmount /mnt/cd
Örnek
Şöyle yaparız. Bir tane foobar.img isimli dosya oluştururz. Bunu ext4 haline getiririz. dosyayı mount ile yükleriz.
# truncate -s 100M foobar.img
# mkfs.ext4 foobar.img
Creating filesystem with 102400 1k blocks and 25688 inodes
---> number of inodes determined at mkfs time ^^^^^
# mount -o loop foobar.img loop/
# touch loop/{1..25688}
-o remount seçeneği
Örnek -ro yüklemek
Readonly olarak tekrar yüklememizi sağlar. Şöyle yaparız.
mount #To determine how the partition is mounted
mount -o remount,ro /dev/sd(yourpartition) directory
Örnek -ro yüklemek
Şöyle yaparız.
$ sudo mount -oro,remount /mountpoint
Örnek - mask ile yüklemek
Şöyle yaparız.
mount -o ro,dmask=0022,fmask=0133,gid=$(id -g),uid=$(id -u) /dev/usb1 /media/usb1
Örnek - rw yüklemek
Şöyle yaparız
mount -o remount,rw /
4. -t seçeneği
type anlamına gelir. mount normalde dosya sisteminin tipini tahmin edebilir. Ancak kendimiz belirtmek istersek şöyle yaparız. Örnekte -t ile dosya sistemi tipi, none ile device ismi, /sys.. ile device için yolu veriyoruz.
mount -t debugfs none /sys/kernel/debug
iso kurulum dosyasını yüklemek için şöyle yaparız.
mount -t iso960 -o loop linux.iso /mnt/iso
Diğer
mount edilmiş diskler
Mount edilmiş diskleri görmek için /proc/mounts dizini altına bakılabilir. procfs açıklamasında şöyle yazıyor
/proc/mounts, a symlink to self/mounts which contains a list of the currently mounted devices and their mount points (and which file system is in use and what mount options are in use).

21 Haziran 2020 Pazar

find komutu

1. Synopsis
Şöyledir.
SYNOPSIS
     find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
2. Dosyaları Bulma Sırası
Dosyaları bulma sırası her zaman aynı değildir. Açıklaması şöyle
The order find processes the files is not deterministic. It may be just the same order as the underlying system call gives, which probably depends on the underlying filesystem structure and can be essentially random.
3. Farklı Path'ler Yan Yana Verilebilir
Örnek
Hem /usr/local/bin hem de /bin dizinler arama yapmak için şöyle yaparız.
$ find /usr/local/bin/ /bin/ -printf '%P\n'
4. Seçenekler
Bazı arama seçenekleri şöyle
Büyüklüğe göre arama seçenekleri

Access Denied veya Permission Denied Hataları
Access denied hataları STDERR akımına yazılır. Bu hataları görmemek için STDERR akımını /dev/null'a yönlendiririz. Şöyle yaparız.
find /home -iname "*.pdf" 2>/dev/null
Bir diğer çözüm ise STERR akımını STDOUT akımına yönlendirmek ve hataları grep -v ile göstermemek. Şöyle yaparız.
find /home -iname "*.pdf" 2>&1 | grep -v "access denied"
- atime seçeneği
Son x günde erişilmemiş dosyaları listeler. Dosyaya erişilmesi değiştirildiği anlamına gelmez. Bu seçenek te aynı -mtime seçeneği gibi gün cinsinden sayar. Yani 1.5 gün diye bir şey bilmez. 1 gün, 2 gün, 3 gün şeklinde sayar. Açıklaması şöyle
When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago.
-E seçeneği
Extended regex anlamına gelir. Şöyle yaparız.
find -E . -iregex ".*optimizing.*"
-delete seçeneği
delete seçeneği yazısına taşıdım

-empty seçeneği
Örnek - not empty
Sadece hex zero içeren dosyaları bulmak için şöyle yaparız. Burada not empty kullanılıyor
find path/to/startdir/ -type f ! -empty -exec grep -zvL '^$' {} +
Örnek
Elimizde şöyle bir yapı olsun.
Parent/
  |____Child1/
        |______ file11.txt (empty)
        |______ Dir1/ (empty)

  |____Child2/
        |_______ file21.txt
        |_______ file22.txt (empty)

  |____ file1.txt
parentdir'ın altındaki boş dosyaları/dizinleri silmek için şöyle yaparız.
find Parent -empty -delete
Çıktı olarak şunu alırız
Parent/
  |____Child2/
        |_______ file21.txt

  |____ file1.txt
Örnek
parentdir'ın altındaki boş dizinleri silmek için şöyle yaparız.
find /home/user/parentdir/* -type d -empty -delete
-exec seçeneği
exec seçeneği yazısına taşıdım

-iname seçeneği
Aranacak dosya ismini belirtir. Şöyle yaparız.
find /etc -iname '*abc*' -delete
-inum seçeneği
Belirtilen inode numarasını kullanır. Sözdizimi şöyledir.
find <somepath> -inum <inode_number> ...;
Örnek
Dosyaların inode numarasını görmek için şöyle yaparız.
$ ls -li
total 0
133370 -rw-r--r-- 1 malte malte 0 Dec 30 19:00 ...
132584 -rw-r--r-- 1 malte malte 0 Dec 30 18:59 ...
Bu dosyaları silmek için şöyle yaparız.
$ find .  \( -inum 133370 -o -inum 132584 \) -exec rm -i {} \;
Örnek
Şöyle yaparız
#inode numarasını bul
ls -lid -- *env*

# İlk sütundaki inode numarasını al ve aşağiya ekle
find . -inum <inode> -delete
Örnek
Şöyle yaparız. inum olarak dizinin numarasını veriyoruz ve içini listeliyoruz.
$ find . -inum 888696 -exec ls '{}' \;
Conversation.pst  Outlook Data File  Outlook Data File.sbd  Trash      Unsent Messages
Inbox.pst     Outlook Data File.msf  Sent.pst       Trash.msf  Unsent Messages.msf
-iregex seçeneği
regex seçeneği yazısına taşıdım

-max-matches seçeneği
Çok fazla sonuç dönüyorsa ve bunu sınırlandırmak istersek kullanırız.
Örnek
Şöyle yaparız.
find -max-matches 1000 -exec mv {} /path/to/collection1 \+; 
-maxdepth seçeneği
Açıklaması şöyle
Since the find command is recursive, it can sometimes return quite a lot of results. If you want to limit the number of levels, then use the -maxdepth option. Similarly, you can use -mindepth to define a minimum depth to go to, before results start to be returned.
Örnek
Şöyle yaparız. Bakılacak derinliği belirtir.
find . -maxdepth 2 -regextype egrep -type f -regex './dump-[0-9]{4}\.zip' -delete
Örnek
Sadece belli bir derinlikteki dosyaları bulmak için şöyle yaparız
find . -name "*.txt" -maxdepth 2 -mindepth 2
-name seçeneği
name seçeneği yazısına taşıdım

-path seçeneği
path seçeneği yazısına taşıdım

printf seçeneği
printf seçeneği yazısına taşıdım

-prune seçeneği
Bu seçenek bayağı tartışmalı. 
Örnek
Bazı dizinlere girilmemesini sağlar. dir1,dir2,dir3 dizinlerine girmemek için şöyle yaparız.
find . -type d \( -path dir1 -o -path dir2 -o -path dir3 \) -prune -o -print
Örnek
"." (nokta) karakteri ile başlayan dizinlere girmemek için şöyle yaparız
find . -mindepth 1 -type d \( -name '.*' -prune -o -print \)
-regex seçeneği
regex seçeneği yazısına taşıdım


xdev seçeneği
Farklı dosya sistemleri aynı inode numarasına sahip olabilir. Sadece başlangıç noktasındaki dosya sistemi yani tek bir dosya sisteminde arama yapmak için şöyle yaparız.
find / -xdev -inum 12582925