2020-06-26

Windows'a çevrimiçi duvar kağıtları

Şu yazımda Bing'in günlük resimlerinin Fedora'da nasıl duvar kağıdı olarak kullanılabileceğini yazmıştım. Bu aslında internetten bulduğum bir içerikti.

Buradan esinlenerek bu işi Windows'da nasıl yapabilirim diye düşündüm. Powershell'de aynısını yapmaya karar verdim.

Önce gereken değişkenleri tanımlayalım:
$bing="www.bing.com"
$xmlURL="http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US"
$saveDir="D:\wallpapers\"
$picExt=".jpg"
$desiredPicRes="_1440x900"
$fullstop = $false 
$saveDir ile belirtilen klasörün var olduğundan emin olmalıyız. Fedora için yaptığımız gibi var olsun olmasın yaratılması için
New-Item -ItemType Directory -Path $saveDir -ErrorAction SilentlyContinue | Out-Null
Ya da powershell'e özgü Test-Path ile kontrol edip daha sonra yaratmaya gidebiliriz.
if (-Not (Test-Path $saveDir))
{
    New-Item -ItemType Directory _path $saveDir
}
gibi.

Bing'in günlük duvar kağıdı bilgilerini paylaştığı bir xml çevrimiçi verisi var, $xmlURL değişkeni ile verilen adreste. Bu verinin içinde <urlbase> tag'inin içeriğini kullanarak istediğimiz çözünürlükte (varsa) resmi edinebiliriz. Her durumda bu olmayabiliyor. İstdediğimiz çözünürlükte resim yoksa varsayılanı kullanmayı deneyebiliriz.
[xml]$response = (New-Object System.Net.WebClient).DownloadString($xmlURL)

$defaultPicURL = $response.images.image.url
$desiredPicURL = $response.images.image.urlbase + $desiredPicRes + $picExt
<urlbase> tagından elde edilen dosya isimleri şu formatta oluyor:

/th?id=OHR.MontageJupiterIo_EN-US2310290045

Ben bunları şu formatta kaydetmek istiyorum:

MontageJupiterIo_EN-US2310290045_1440x900.jpg

Bunun için de aşağıdaki kırpma işlemlerine tabi tutuyorum:
 
$checkfile = $defaultPicURL.split("&")[0]
$checkfile = $checkfile.split(".")[1] + "." + $checkfile.split(".")[2]
 
Fedora için bu adımları orijinal olarak öneren kişi resimleri günlük olarak tutuyor, yenisini indirince siliyordu. Ben silmemeyi tercih ettim. Ama bu da bir resmin ikinciye indirilme girişimini kontrol etmemi gerektirdi. Bunun için yukarıdaki checkfile değişkeni içinde saklanan dosya adını biraz daha kırpıp dosya uzantısını yok ettim:

$checkfile = $checkfile.substring(0,$checkfile.length-4)

Bu aşamadan sonra bir if bloğunun içinde istenen çözünürlükte dosya var mı diye kontrol ediyorum.
 
if ((dir (Join-Path -Path $saveDir -ChildPath ($checkfile + "*"))).Count -eq 0)
 
Gerçekten bu kadar ayrıntılı bir if koşuluna gerek yoktu aslında, ama benim bu resimleri indirdiğim klasördeki isim karmaşası bunu gerektirdi. Neyse, yukarıdaki if koşulunun doğru olduğu durum için aşağıdaki gibi uzun bir kod var. Burada önce istenen çözünürlük var mı, onu kontrol ediyorum, iwr (Invoke-WebRequest) ile. Sadece dosyanın var olup olmadığını öğrenmek için HTTP HEAD yöntemini kullanması için de -Method parametresi ile head değerini gönderiyorum, ilk try bloğunun içinde. Yoksa iwr'in bir error throw etmesi için de -EA stop kullandım. Catch'in içinde de istenen çöznürlüğün yerine varsayılan çözünürlüğün kullanılmasını sağladım. İç içe iki try-catch ile varsayılan çözünürlükteki resmin de olup olmadığını kontrol ettim. finally bloğunun içinde de bulunan (istenen çözünürlük veya varsayılan) resmin download edilmesini, duvarkağıdı olarak ayarlanmasını sağlayan fonksiyonu çağırdım. Birkaç log tutma satırı ile birlikte.

try {
     $resp = iwr -Uri ($bing + $desiredPicURL) -EA Stop -Method Head

    # desired URL OK
     Write-Host "desired res OK."
    $picName = $desiredPicURL.split(".")[1] + "." +          $desiredPicURL.split(".")[2]
    $fullPath = Join-Path -Path $saveDir -ChildPath $picName
}

catch {
     # desired not available
    try {
        $resp = iwr -Uri ($bing + $defaultPicURL) -EA Stop -Method Head
        Write-Host "desired not found, falling back to default."
        $picName = $defaultPicURL.split("&")[0]
        $picName = $picName.split(".")[1] + "." +                 $picName.split(".")[2]
        $fullPath = Join-Path -Path $saveDir -ChildPath $picName
     }

    catch {
        # neither default available
        Write-Host "None available right now."
        $fullstop = $true
        Break
    }

}

finally {

    if ($fullstop) {
        # here means nothing found
        Add-Content -Path $logfile -Value "$bugun - nothing found."
    }
    else {
        # hear means something is found, either desired or default
        try {
            $resp = iwr -Uri ($bing + $defaultPicURL) -OutFile $fullPath
            Add-Content -Path $logfile -Value "$bugun - downloaded : $fullpath"
            Set-WallPaper $fullpath
        }

    catch {
        $hata = $PSItem.Exception.ToString()
        Write-Host "last stage error: $hata"
        Add-Content -Path $logfile -Value "$bugun - last stage error."
        }
    }
}

 
Bir adım önceki if'e ait else bloğunda da eğer dosya zaten varsa bir daha indirilmemesini ve işlem kaydı düşülmesini sağladım.

else {
    Write-Host "File is already downloaded:" (dir (Join-Path -Path $saveDir -ChildPath ($checkfile + "*")))[0]
    Add-Content -Path $logfile -Value "$bugun - file is already downloaded."
}

Hayatını kodlama ile kazananlar; yukarıdaki karmaşa için kusura bakmayın.

Sonrasında bunu Görev Zamanlayıcısıyla otomatik çalıştırmaya ayarlamak kalıyor. Bunun için Set-ExecutionPolicy ile çalıştırma politikasını uygun şekilde değiştirmek, ps1 dosyasını imzalamak ya da komut satırından powershell.exe ile birlikte -ExecutionPolicy anahtarını kullanmak gerekebilir.

28.06.2020 Düzenleme: Registry'deki anahtarı değiştirip daha sonra rundll32.exe'yi kullanarak UpdatePerUserSystemParameters çağrısı yeni sistemlerde pek işe yaramıyor. Bunun yerine şurada SystemParametersInfo API'sinin kullanılması önerilmiş. Bunu powershell'de nasıl yapabiliriz diye düşünürken önce Matt Graeber'in blog'unda yazdıklarına denk geldim. Çok faydalı olarak PInvoke.com sitesini önermiş. Ama burdan sonra yapılacak bir dünya iş vardı ve ben bu notasyona aşina değildim. Daha fazla aramayla Jose Espitia'nın bloguna denk geldim. Bu işte tam aradığım şeydi. SystemParametersInfo'nun Powershell'den çağrılabilir hale getirilmişi. Bunu kullanarak tam sonuca ulaştım.

Function Set-WallPaper($Image) {
<#
.SYNOPSIS
Applies a specified wallpaper to the current user's desktop
   
.PARAMETER Image
Provide the exact path to the image
.EXAMPLE
Set-WallPaper -Image "C:\Wallpaper\Default.jpg"
#>
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
public class Params
{
    [DllImport("User32.dll",CharSet=CharSet.Unicode)]
    public static extern int SystemParametersInfo (Int32 uAction,
                                                   Int32 uParam,
                                                   String lpvParam,
                                                   Int32 fuWinIni);
}
'@
$SPI_SETDESKWALLPAPER = 0x0014
$UpdateIniFile = 0x01
$SendChangeEvent = 0x02
$fWinIni = $UpdateIniFile -bor $SendChangeEvent
$ret = [Params]::SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, $Image, $fWinIni)
}

Linux'ta diskte yer açmak

Bir süredir hakkında kısa kısa bilgiler biriktirdiğim konuları hızlıca blog'a koymaya başladım. Sanırım anlatımlar biraz eksik kaldı. Umarım yakın zamanda tekrar üzerinden geçerim. Bu dil ile ilgili daha fazla beklentileri olanlardan özür niteliğinde olsun.

Son zamanlarda kullandığım dağıtımlar Fedora ve Arch/Manjaro'dan ibaret. Bu sebeple bu başlığın hedefleri bu dağıtımlar.

Bir süre kullanılan linux kurulumları gerek paket güncellemeleri gerekse loglar sebebiyle çok yer kaplamaya başlayabilir. Öncelikle paket ön belleğini konrol edebiliriz.

Fedora
Fedora'da paket önbelleği /var/cache/dnf klasörü altında tutulur. Kaç paket için önbellek olduğunu göremek için
ls -lR /var/cache/dnf | wc -l
ya da toplamda bu klasör ne kadar yer kaplıyor diye bakabilmek için
du -sh /var/cache/dnf
kullanılabilir. Bu klasörün en kapsamlı temizliği için
sudo dnf clean all
komutunu kullanabiliriz. Ama /var/cache/dnf klasörünün tüm içeriği cache verisi olmayabilir.
 
Gereksiz bağımlılıklardan kurtulmak için
sudo dnf autoremove
Arch/Manjaro
Arch türevlerinde ise paket önbelleği /var/cache/pacman/pkg altında tutulur. Kaç dosya var diye bakmak için
ls -lR /var/cache/pacman/pkg | wc -l
ya da burası diskte ne kadar yer kaplıyor diye bakmak için
du -sh /var/cache/pacman/pkg
Arch veya türevlerinde paket önbelleğini temizlemenin birkaç farklı yolu var. Kaldırılmış paketleri temizlemek için
sudo pacman -Sc
ya da kurulu olanları bile kaldırmak için
sudo pacman -Scc
veya daha ayrıntılı olarak sadece son 3 sürümü hariç eski sürümleri silmek için
sudo paccache -r
ve hatta sadece 1 sürüm bırakmak için
sudo paccache -ruk0
kullanılabilir. "Yetim" olarak adlandırılan gereksiz bağımlılıkları görmek için
pacman -Qtdq
ve bu gereksiz bağımlılıklardan kurtulmak için
sudo pacman -Rns $(pacman -Qtdq)
kullanılabilir.
 
Debian/Ubuntu
Kullanılmayan paketleri ve yapılandırma dosyalarını kaldırmak için
sudo apt autoremove --purge

Ama önce nelerin kaldırılacağını görmek için

sudo apt autoremove --dry-run

Debian'da paket önbelleğinin konumu /var/cache/apt/archives/ ve bunun boyutunu kontrol etmek için

du -sh /var/cache/apt/archives/

Paket önbelleğini temizlemek için

sudo apt autoclean
Diskte en çok yer kaplayan paketleri görmek
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -rn | head
 
Kullanıcı önbelleği
Kullanıcı hesabınıza özel önbellek alanının boyutunu kontrol etmek için
du -sh ~/.cache/
temizlemek için
rm -rf ~/.cache/
kullanılabilir, dağıtımdan bağımsız olarak.

journal loglarını temizlemek
Bu işlem de dağıtım bağımsız olarak yapılabilir. Mevcut boyutu kontrol etmek için
 
journalctl --disk-usage
 
komutu kullanılabilir. Sonrasında örneğin en yeni 50 MB'lık veriyi bırakıp eskileri silmek için
journalctl --vacuum-size=50MB
ya da son 4 hafta hariç tüm kayıtları silmek için
journalctl --vacuum-time=4weeks
kullanılabilir.
 
Fedora'da kurulu programlardan en çok yer kaplayanları bulmak için:

rpm -qa --queryformat '%{name} %{size}\n' | sort -n -k 2 -r | head -n 20

Veya bir klasör içinde en çok yer kaplayan alt klasörleri bulmak için
 
du -d 1 /home/metin/Documents/Proje1 | sort -n
 
kullanılabilir. Burada -d 1 ile klasör derinliği 1 olarak seçilmiş, ardından sonuçlar -n ile nümerik olarak (küçükten büyüğe) varsayılan olarak ilk sütuna (sütunlar boşlukla ayrılmış alanlardır ve ikinci sütuna göre sıralama yapmak için -k 2 kullanılır) göre sıralanır. Bu şekilde en çok yer kaplayan klasör tespit edilebilir.
 
Aradığımız büyük bir dosyalar ise bir klasörün içindeki en büyük 5 dosyayı aşağıdaki gibi bulabiliriz.

ls -lRr | sort -n -k 5 | tail -5 | awk '{print $5 " - " $9}'
 
Bunların hepsi geçici yöntemlerdir. Bunları uyguluyorsak artık diski büyütme zamanı gelmiştir. Bunlar sadece biraz daha zaman kazandırabilir.
---

Fedora'ya VirtualBox kurmak

Virtualbox'ı Fedora'ya kurmanın birkaç yolu var. Ama gördüğüm kadarıyla doğru yolu şu:

Öncelikle root olalım:

$ sudo -i

Sonra
cd /etc/yum.repos.d/
klasörünün altına gidelim. Buraya
http://download.virtualbox.org/virtualbox/rpm/fedora/virtualbox.repo
altından virtualbox deposunu indirelim.
wget http://download.virtualbox.org/virtualbox/rpm/fedora/virtualbox.repo
Ardından bir dnf update yapalım:
# dnf update
Şimdi de şu bağımlılıkları kuralım:
# dnf install binutils gcc make patch libgomp glibc-headers glibc-devel kernel-headers kernel-devel dkms qt5-qtx11extras libxkbcommon
Nihayet Virtualbox-6.1 paketini kurabiliriz. Dikkat! VirtualBox paketi değil, sonunda sürüm numarası yazan.
# dnf install VirtualBox-6.1
Bu aşamadan sonra vboxusers grubu yaratılmış olur. VirtualBox'ı kullanacak kullanıcımız bu grubun üyesi olmalı.
# usermod -aG vboxusers metin
Ayrıca ilgili çekirdek modülleri de derlenmiş olmalı. İlerde tekrar derleme (bir çekirdek sürümü güncellemsi sonrasında) gerektiği durumlarda şu script çalıştırılabilir:
# /usr/lib/virtualbox/vboxdrv.sh setup
Daha fazla ayrıntı için [1]'e bakılabilir.

---
[1] https://www.if-not-true-then-false.com/2010/install-virtualbox-with-yum-on-fedora-centos-red-hat-rhel/

Opera'da oynatılamayan videolar

Her ne kadar sonuna kadar Firefox'u desteklesem de Opera'nın bazı avantajları yok değil. Ama maalesef videoları oynatması için gereken codecler eksik geliyor. En azından linux altında.

Şu bilgileri buldum:
- Opera ile birlikte gelen /usr/lib64/opera klasörü altında libffmpeg.so modülü kısıtlı bir sürüm. Bunun tam sürümü çeşitli yazılımlarla birlikte geliyor. Anladığım kadarıyla debian ve türevleri için (hatta belki ArchLinux ve türevleri için de) kullanılabilecek chromium-codecpack paketi bunun tam sürümünü içeriyor. Ama Fedora'da böyle bir paket yok maalesef.
- Visual Studio Code kuruluysa bunun altında
/usr/share/code/libffmpeg.so
da iş yapar.
- Ama bu yoksa mecburen libffmpeg.so'nun tam sürümünü bir yerlerden edinmek gerek. Bu amaçla yine Reddit'te bir uzman demiş ki; https://github.com/iteufel/nwjs-ffmpeg-prebuilt/releases sayfasından ilgili binary'leri indirerek bir yere kaydedin. Sonra da bunu /usr/share/code/libffmpeg.so üzerine kopyalayın.
Yalnız şöyle bir durum var; bu her güncelleme sonrası tekrarlanmalı. Yoksa Opera, her yeni sürümle yine eski kısıtlı sürüm dosyasını getirerek bizim tam sürümün üzerine yazacak. Daha iyisini bulamadım :/

2020-06-25

Fedora'ya çevrimiçi duvar kağıtları

Manjaro'da kullandığım günlük otomatik internetten duvar kağıdı indirme özelliğinin benzerini Fedora'da uygulamak istedim. Youtube'da denk geldiğim şu video üzerinde çalışmaya başladım. Videonun yorumlarında bağlantısı verilen zip dosyasını indirerek işe başladım. Süreç otomatik değil; yönergeleri en azından Fedora 32'de uygulayınca olmadı, ama ufak değişikliklerle çalıştırmayı başardım.

İşin özü bir shell scripti tarafından gerçekleştiriliyor. Adım adım anlatmaya çalışacağım.

Öncelikle bing adresini bir değişkene atalım:
bing="www.bing.com"
Arkasından Bing'de günlük duvar kağıdını almak için kullanılacak adres bir değişkende toplanmış:
xmlURL="http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US"
Bing'in günlük duvar kağıdının kaydedileceği yeri /Resimler klasörümün altındaki bingwallpapers olarak belirledim ve bunu da bir değişkene atalım:
saveDir=$HOME'/Resimler/bingwallpapers/'
Bu klasör -yoksa bile- yaratmak için aşağıdaki komudu çalıştıralım:
mkdir -p $saveDir
Geçerli seçeneklerin arasında

none
wallpaper
centered
scaled
stretched
zoom
spanned

olan resim seçenekleri için varsayılan olarak zoom seçilmiş:
picOpts="zoom"
Kullanmak istediğimiz resim uzantısını (farklı seçenekleri denemedim) seçelim:
picExt=".jpg"
Ekranımıza göre resim çözünürlüğünü belirliyoruz:
desiredPicRes="_1920x1080"
Burada string'in ilk karakterinin bir alt-tire olduğuna dikkat. Resim çözünürlüğü olarak örneğin "_1366x768" de kullanabilirdik.

Her resmin her çözünürlükte kopyası bulunmuyor sanırım. Bu sebeple eğer istediğimiz çözünürlük yoksa varsayılan çözünürlüğü kullanacağız.

Şimdi yukarıda xmlURL olarak verilen URL'deki içeriğin ilk birkaç satırını inceleyelim:
<images>
<image>
<startdate>20200625</startdate>
<fullstartdate>202006250000</fullstartdate>
<enddate>20200626</enddate>
<url>
/th?id=OHR.GorchFock_EN-US6157323134_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp
</url>

<urlBase>/th?id=OHR.GorchFock_EN-US6157323134</urlBase>
<copyright>
German navy tall ship Gorch Fock in waters off Reykjavík, Iceland (© DEEPOL by plainpicture/Henn Photography)
</copyright>
Burada dikkat edilecek bölümleri kalın olarak yazmaya çalıştım:

url tag'ının içindeki kısım varsayılan çözünürlükteki resmin kısmi yolu (başına bing eklenecek). Bu amaçla aşağıdaki değişkeni yaratıyoruz:
defaultPicURL=$bing$(echo $(curl -s $xmlURL) | grep -oP "<url>(.*)</url>" | 
cut -d ">" -f 2 | cut -d "<" -f 1)
urlBase tag'ının içindeki kısım ise bizim istediğimiz çözünürlükteki resmi elde etmek için kullanacağımız kısmi yol. Bu amaçla da aşağıdaki değişkeni yaratıyoruz:
desiredPicURL=$bing$(echo $(curl -s $xmlURL) | grep -oP "<urlBase>(.*)</urlBase>" | 
cut -d ">" -f 2 | cut -d "<" -f 1)$desiredPicRes$picExt
Sonra istediğimiz çözünürlükte resim URL'i geçerli mi diye bir if koşulu içinde gerekli denetimi gerçekleştirip geçerli ise bu adresi, geçerli değilse varsayılanı indirmeyi gerçekleştiriyoruz (çok fazla hata denetimi yok).
if wget --quiet --spider "$desiredPicURL"
then
    picName=${desiredPicURL##*OHR.}
    curl -s -o $saveDir$picName $desiredPicURL
else
    picName=${defaultPicURL##*OHR.}
    picName=${picName%%&*}
    curl -s -o $saveDir$picName $defaultPicURL
fi
Burada indirdiğimi resmin adını da picName değişkeninde depoladık. Şimdi bu indirdiğimiz resmi gsettings aracını kullanarak duvar kağıdı olarak değiştirelim:
gsettings set org.gnome.desktop.background picture-uri "$saveDir$picName"
Sonra da resmin duvar kağıdı olarak nasıl ölçeklendirileceğini seçelim:
gsettings set org.gnome.desktop.background picture-options $picOpts
Şimdi bir tek bu script'i oturum açışta çalıştırmak kaldı. Bunu yapmak için de Youtube videosındaki Laberinto kullanıcısı ev klasörünün altındaki .config klasörünün altında autostart alt klasörü oluşturup, içine daha önce indirdiğimiz zi dosyasının içinden çıkan  bingwallpapers.desktop dosyasını yapıştırmış. Bu iki dosya için de çalıştırma yetkileri vermeyi unutmayalım.

Bu şekilde bing.com'un günlük resimlerini duvarkağıdı olarak kullanabiliriz :)

2020-06-22

Robocopy

Çoğu durumlarda grafik arayüzün dosya kopyalama yetenekleri ile yetiniyoruz. Bunun dezavantajlarından biri olabilecekler hakkında önceden karar verilemiyor olması. Oluşan sıra dışı durumlar veya hatalar (dosya üzerine yazma, hedefteki dosyanın kaynaktakinden yeni olması vs) ile ilgili oluştuğu anda soru sorar. Bu da tüm süreç boyunca klavyenin başında oturulmasını gerektirir. Düz komut satırı aracı copy ise daha az şeyler sunar.

Bunun alternatifi, yine bir Windows aracı olan Robocopy olabilir.

C:\Klasor1 klasörü kaynak, D:\Klasor2 de hedef konumumuz olsun.

Düz kopyalama
C:\robocopy C:\Klasor1 D:\Klasor2
Bu yöntem ile boş klasörler kopyalanmaz.

Boş klasörleri de hedefte yarat
C:\robocopy C:\Klasor1 D:\Klasor2 /E
Taşı
C:\robocopy C:\Klasor1 D:\Klasor2 /E /MOVE
Bu şekilde C:\Klasor1 de silinir, tüm içerik D:\Klasor2 içine taşınmış olur.

Taşı ama klasör yapısını silme
C:\robocopy C:\Klasor1 D:\Klasor2 /E /MOV
Sadece MOVE anahtarının son harfini silerek kaynak konumun klasör yapısını bozmadan taşıma işleminin yapılmasını sağlar. Bu şekilde kaynaktaki klasör yapısının var olmasını bekleyen başka programların çalışması olumsuz etkilenmez.

Aynalama
C:\robocopy C:\Klasor1 D:\Klasor2 /E /MIR 
Kaynak klasörün tüm dosya yapısının aynısı hedefte oluşturulur. Eğer tüm dosyalar mevcutsa ve robocopy işlemi tekrarlanıyorsa kaynaktaki yeni oluşturulan dosyalar hedefe ilave edilir, veya kaynakta silinmiş dosyalar hedeften de silinir.

Hariç Tutma
Bir klasörü hariç tutarak taşımayı tamamlamak için /XD anahtarı kullanılır.
C:\robocopy C:\Klasor1 D:\Klasor2 /E /XD "C:\Klasor1\temp"
Burada klasör ismi yukarıdaki gibi tam yol ile verilebileceği gibi wildcard'lar ile de verilebilir:
C:\robocopy C:\Klasor1 D:\Klasor2 /E /XD "*temp*"
Benzer şekilde dosya hariç tutma için /XF anahtarı kullanılır.
C:\robocopy C:\Klasor1 D:\Klasor2 /E /XF "C:\Klasor1\bilgi.txt"
Burada da dosya adı tam yol veya wildcard'larla belirtilebilir.

    C:\robocopy C:\Klasor1 D:\Klasor2 /E /XF "*.txt"

Yenileri hariç tutarak taşı. Hedefte daha yeni dosya varsa hariç tut:

C:\robocopy C:\klasor1 D:\klasor2 /E /XN

Değişen dosyaları hariç tut. Burada değişiklik dosya boyutu bazında. Son değişitirme tarihi aynı olup boyutu farklı olan dosyaları da taşıma kapsamında tut:

C:\robocopy C:\klasor1 D:\klasor2 /E /XC
 
Kayıt tut
Yaptıklarının kaydını tut
 
C:\robocopy C:\klasor1 D:\klasor2 /E /LOG:D:\robolog.txt

Ya da hem kaydını tut, hem de ekrana yaz: 

C:\robocopy C:\klasor1 D:\klasor2 /E /TEE /LOG:D:\robolog.txt

Yedekleme modunda başla

Tek bir dosya kopyalıyoruz. Garip bir şey ama, yetkiniz olmasına rağmen korumalı bir dosya üzerine yazmak istiyorsanız bunu yapabileceğiniz bir anahtarı var:

C:\robocopy C:\klasor1 D:\klasor2 sistemdosyasi.dll /E /B

Devam ettirilebilir kipte kopyala

Ara sıra kesilen bir ağ bağlantısı üzerinden büyük bir dosya kopyalıyoruz. Bağlantısı kesildikten sonra tekrar bağlandığında kopyalamaya baştan başlamasını değil de kaldığımız yerden devam etmesini istiyoruz. Bu durumda:

C:\robocopy C:\klasor1 D:\klasor2 /E /Z

Bir de devam ettirilebilir kipte başlayıp, yetki sorunu çıkarması durumunda yedekleme kipine geçmesi var:

C:\robocopy C:\klasor1 D:\klasor2 /E /ZB

 ---
[1] https://www.youtube.com/watch?v=gTzTeHmKMKw

Farklı dağıtımlardaki grub komutları

Grub komutları her dağıtımda farklılık gösterebiliyor. Örneğin Ubuntu'da

$ sudo update-grub
komutu ile grub menüsü güncellenebiliyor. Ama bakınca aslında grub-mkconfig'i kullanan basit bir script'ten başka birşey değil. İçeriği kabaca şöyle:

grub-mkconfig -o /boot/grub/grub.cfg

Hatta update-grub2 de, update-grub'a bir kısayol.

Grub diskin başına yazmak için kullanılan komutsa Ubuntu'da şöyle:

$ sudo grub-install /dev/sda
Fedora'da ise update-grub ya da update-grub2 gibi bir şey söz konusu değil. Grub menüsünü yeniden oluşturmak için kullanılacak komut şöyle:

$ sudo grub2-mkconfig -o /boot/efi/EFI/grub.cfg
Benzer şekilde grub'ı diskin başına yazmak için ise

$ sudo grub2-install /dev/sda
kullanılıyor.

Fedora'da grub menüsünü düzenlemek için kullanılan grubby adında diğer dağıtımlarda bulamadığım bir araç da var.

Yine Fedora'da rescue çekirdeği ve initramfs'i tutuluyor. Bunları silmeniz durumunda tekrar yaratmak için dracut kullanılıyor. Var olanların üzerine yazmak için --force parametresi kullanılabilir.

Arch / Manjaro'da da Ubuntu'ya benzer şekilde update-grub var ki o da arka planda grub-mkconfig'i kullanan bir script. Ama burada update-grub2 gibi bir kısayol söz konusu değil.

$ sudo update-grub
Grub'ı diskin başına yazmak içinse yine

$ sudo grub-install /dev/sda
kullanılıyor. Tüm grub-install'ları BIOS sistemler için yazdım. UEFI sistemlerde ise kullanılacak komut şöyle:

$ grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=manjaro --recheck