2018-11-16

Komut satırından clipboard kullanımı

Bir komutun çıktısını komut satırı penceresinde uzun uzun işaretleyip kopyalamaktansa pipe ile clipboard'a aktarmayı nasıl yaparım diye ararken şu sayfaya denk geldim. Aslında eski komu satırı ile bu işi yaparken clip.exe iş görüyor. Örneğin
dir *.txt /b /s | clip
ile mevcut klasörün tüm alt klasörlerindeki txt dosyalarının isimlerini clipboard'a kopyalayabilirim.

Peki bunun eşdeğeri powershell'de var mıdır diye arıyordum ki arkadaş 3 senelik çalışmasının sonuçlarını paylaşmış, sağolsun. Ama altına Nihayet Mark Minasi bile gelip yorum yapmış; sanıyorum ki gerçek Mark Minasi. Demiş ki, WMF 5.0 ile Get-Clipboard ve Set-Clipboard cmdlet'leri geldi. WMF 5.0 de Powershell 5 demek oluyor.

Şu an itibariyle en son WMF 5.1 var ve yükleyince şu oluyor:
PS> $PSVersionTable
Name                           Value
----                           -----
PSVersion                      5.0.10586.117
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.10586.117
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

TL;DR
Aynı işi powershell'de yapmak için

dir *.txt -recurse | Set-Clipboard
yeterli.

Komut satırını her açtığımda çalışsın

Powershell'de her açtığımda çalışmasını istediğim bazı komutlarım vardı. Onları profil Belgelerim klasörümün altındaki WindowsPowerShell altına profile.ps1 dosyasına kaydettim (ayrıca bu klasörün altında Modules\[modülismi]\[modülismi].psm1 gibi bir klasöre de kendi modülümü oluşturdum).

Benzer şekilde komut satırı penceresi için de her seferinde çalışacak bir komut dosyası oluşturmak istedim. Bunun cevabını da şurada buldum. Buna göre
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
altına AutoRun adında REG_EXPAND_SZ tipinde bir değer yaratıp adını da örneğin %USERPROFILE%\init.cmd vererek profil klasörümün altındaki init.cmd dosyasının çalışmasını sağlayabilirim. Bu işi tek bir komutta yapmak istersek bunun yolu da
reg add "HKCU\Software\Microsoft\Command Processor" /v AutoRun ^
  /t REG_EXPAND_SZ /d "%"USERPROFILE"%\init.cmd" /f
şeklinde verilmiş. Bu da güzel. Örneğin bir ortam değişkeni yaratıp bir de alias yaratmak için içeriğini şöyle oluşturabiliriz:

@echo off
set gdrv="C:\Users\metin\Google Drive"
doskey ls=dir /on
Hep linux zırvası bunlar.

---
[1] https://stackoverflow.com/questions/17404165/how-to-run-a-command-on-command-prompt-startup-in-windows
[2] https://stackoverflow.com/questions/20530996/aliases-in-windows-command-prompt
[3] https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc779439(v=ws.10)

2018-11-15

Windows'da sembolik ve hard link'ler

Windows'da kısayol yaratmanın düz yolu kısayolu kopyalayıp, yapıştırırken "kısayol yapıştır"ı seçmek. Bu şekilde aslında lnk uzantılı bir dosya yaratılır. Bu kısayol çift tıklandığında bu bu lnk uzantılı dosyanın işaret ettiği dosya çalıştırılır.

Bundan başka bir de sembolik link yaratma var. C:\Windows\system32\notepad.exe'nin sembolik linkini yaratmak için komut satırında şunları yazmak gerek (mklink'i yönetici hakları ile çalıştırarak):
mklink notdefteri C:\Windows\system32\notepad.exe
Bu iki yöntem ile mevcut klasörde yaratılan dosyaların farkı aşağıdaki gibi olacak
15.11.2018  13:27    <SYMLINK>      notdefteri [C:\Windows\System32\notepad.exe]
15.11.2018  13:28             1.191 notdefteri.lnk
İlki sembolik kısayol (<SYMLINK> olarak görülüyor), diğeri "kısayolu yapıştır" yöntemi ile oluşturulan.

Bir klasörün sembolink link'ini oluşturmak için /D anahtarı kullanılmalı.

mklink /D Belgelerim C:\Users\metin\Documents

Bu yöntemle oluşturulan kısayol şöyle gözükür (<SYMLINKD>):
15.11.2018  13:34    <SYMLINKD>     tf [E:\testfolder]
Sembolik linkler silinse bile notepad.exe dosyası silinmez. Çünkü bunlar asıl notepad.exe dosyasını gösteren işaretçilerdir. Ama notepad.exe silinirse o zaman sembolik linkler anlamsız birer işaretçi olurlar.

Dosya sistemindeki sembolik linkleri bulmak için dir komutunu /AL ile kullanmak gerek:
dir /AL
Eğer bir klasörün alt klasörlerindeki bütün dosyaları bulmak istiyorsak
dir /AL /S C:\Users
kullanılabilir. Aynı şeyi powershell ile yapmak istersek
Get-ChildItem | where {$_.Attributes -match "ReparsePoint"}
Powershell ile dir komutu (Get-ChildItem) kullanıldığında ilk sütunda görüntülenen Mode alanındaki dosyanın öznitelikleri (attributes) listelenir. Bu özniteliklerden en sağdaki veri dosyanın bir reparsepoint olup olmadığını gösterir. Sembolik linkler için bu kısımda bir "l" harfi gösterilir. Örnek:
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d----l       15.11.2018     13:34                tf
-a---l       15.11.2018     13:27              0 notdefter
Bundan başka bir de hard link'ler var. Bunun için mklink'i  /H anahtarını ile kullanmak lazım:
mklink /H hardlink dosya.exe
Bunun sonucunda diskin üzerindeki aynı veriyi gösteren iki dosya sistemi girişimiz olur. Bunlardan biri silinse bile asıl dosya verisi silinmez. Hard link'in hedefi aynı disk bölümü içinde olmalıdır.

Hard link'ler klasörler için olmaz. Klasörler için benzer kavram junction'dır. Başka bir disk bölümünde yer alan klasör için junction yaratılabilir. Örnek:
mklink /J junction D:\testfolder
Bu konuları özetlemek için ss64.com sitesinden alınma aşağıdaki tablo faydalı olabilir:

Windows komut satırından exe dosyası sürüm numarası sorgulama

Hızlı bir şekilde, çoğunlukla da uzaktaki bir sistemdeki bir exe dosyasının sürüm bilgisini öğrenmek istediğimde şu yöntemlerden birini kullanıyorum.

Düz Windows ortamı, ek bir araç kullanmadan, doğrudan komut satırından:

wmic datafile where name='C:\\windows\\notepad.exe' get Version
Bu yöntem ile ağ üzerinden uzaktaki dosya sorgusu mümkün değil. datafile parametresi UNC yolları desteklemiyor.

Ağ üzerinden sorgu yapabilmek için Sysinternals'ın sigcheck komutuna ihtiyaç var. Kullanım şöyle:
sigcheck -nobanner -n \\uzakbilgisayar\c$\Windows\notepad.exe
Powershell ile yapmak için ise
(Get-Item \\uzakbilgisayar\c$\Windows\notepad.exe).VersionInfo.Fileversion
kullanılabilir.

2018-10-23

İnternet ve kısayollar

İnternette dolaşırken sıkça kullanmaya başladığım birkaç kısa yol şöyle:

DuckDuckGo kısayolları
h : Arama kutusuna git, arama metnini seç
j veya alt ok : arama sonuçlarında aşağıya git (odağı kazanmamışsa sayfada boş bir yere tıklamak gerekebilir)
k veya üst ok : arama sonuçlarında yukarıya git
t : arama sonuçlarında en üste git
l (küçük L harfi) veya o (küçük O harfi) : seçili arama sonucunu aç

Youtube
Herhangi bir youtube videosunu izlerken Shift+? kısayollar listeler.
boşluk çubuğu : oynatmayı duraklat / devam ettir (odak videoda olmalı)
k : oynatmayı duraklat / devam ettir (odağın videoda olmasına gerek yok)
m : videoyu sessize al
c : altyazılar varsa etkinleştir
sola ok : videoda 5 saniye geriye git
j : videoda 10 saniye geriye git
sağa ok : videoda 5 saniye ileriye git
l (küçük L harfi) : videoda 10 saniye ileriye git
yukarı ok : sesi artır
aşağı ok : sesi azalt
0 (sıfır) : videonun başına git
1-9 : video'nun sırasıyla %10, %20, ... %90'ına atla
ö veya / : youtube'un arama kutusuna git
Shift + N : oynatma listesinde bir sonraki videoya atla
Shift + P : oynatma listesinde bir önceki videoya atla
Ctrl + sağ ok : videonun ilerleme çubuğunda görülen bir sonraki bölümüne atla
Ctrl + sol ok : videonun ilerleme çubuğunda görülen bir önceki bölümüne atla
> veya Shift + . : oynatma hızını artır
< veya Shift + , : oynatma hızını düşür
. / , : (duraklatılığında) videoda 1'er kare olarak ileri veya geri git
t : Sinema modunu aç veya kapat
i : mini oynatıcıya geç
---
[1] https://duck.co/help/features/keyboard-shortcuts
[2] https://support.google.com/youtube/answer/7631406?hl=en

2018-07-23

archlinux kablosuz ağ şifresini güncelleme

İlk archlinux kurulumumda, wifi şifresini değiştirdikten sonra ağ bağlantısı sorunu yaşamaya başladım. Bilgisayarım bir türlü şifresi değişen kablosuz ağa bağlanmıyordu. Archlinux forumlarındaki şu sayfada faydalı birkaç öneri verilmiş.

Kablosuz erişim noktası üzerindeki kablosuz ağ şifremi değiştirdikten sonra /etc/netctl klasörü altında profil dosyama girip şifremi güncellemiştim. Benimki için dosya adı
/etc/netctl/wlo1-Deneme
idi. Dosyanın içinde Key ile başlayan satırdaki şifreyi güncelledikten sonra
sudo netctl start wlo1-Deneme
komutu ile profilimi başlatmayı denediğimde şöyle bir hata alıyordum:

Job for netctl@Deneme.service failed because the control process exited with error code. 
See "systemctl status netctl@Deneme.service" and "journalctl -xe" for details.

Forumdaki yüce kişilik öncelikle bu hatanın birden fazla IP otomatik ayarlaması yapan hizmetin çalışması ile ilgili olabileceğini farkederek bu kontrolü yaptırmış:
ls -l /etc/systemd/system/multi-user.target.wants 
 Klasörünün altındaki hizmetleri listeletmiş. Benimkinde de dhcp hizmetine ait bir öğe vardı. Önce onu kaldırdım:
systemctl disable dhcpcd.service systemd-networkd.service wicd.service
Daha sonra bilgisayarımı tekrar başlattım. Bilgisayarım tekrar başladıktan sonra netctl komutlarına daha önceki gibi hata vermeyi bıraktı. Artık wifi şifremi değiştirdikten sonra ilgili profil dosyamdaki şifreyi değiştirip sonrasında
netctl stop wlo1-Deneme
ve ardından (bazı durumlarda ip link set wlo1 up gerekebilir)
netctl start wlo1-Deneme
yapmam yetiyor :)

Ek 2019-05-29: Bilgisayarımın bağlandığı varsayılan wifi ağını değiştirdim. Archlinux, hala eski ağa bağlanmaya çalışıyor. Yenisine otomatik olarak bağlanmıyor. Şu adımları izledim:
sudo netctl disable wlo1-EskiAg
sudo netctl enable wlo1-YeniAg
Bu şekilde /etc/systemd/system/multi-user.target.wants  altındaki varsayılan bağlantı değiştirilir.

Archlinux ve pacman

Ubuntu ve Fedora'nın ardından yeni favorim Archlinux. Bir deneme yapabilmek için diskimde yeni bir bölüm oluşturdum, manuel kurulumu tamamladım. Komut satırı, AUR ve pacman ile biraz daha yakın ilişkim olacak, orası kesin.

Pacman'i biraz özetlemek benim için faydalı olacak.

Öncelikle söylenen o ki pacman, apt ve dnf'e kıyasla daha hızlı. Ama ihtiyaç duyulan parametreler biraz daha içgüdüden uzak. Kendi içinde bir yapısı var elbette, ama öğremek zaman alacak.

 Pacman'da işlemler 5 ana kategoride:

-Q : (Query) pacman veritabanını sorgula
-R : (Remove) sistemden paket kaldır
-S : (Sync) paketleri senkronize et
-U : (Upgrade) Sistemdeki paketleri güncelle
-F : (File) sistemde kurulu dosyaların içinde sorgu çalıştır

Query (-Q) işlemleri için kullanılabilecek anahtarlar:
-i : Kurulu paket ile ilgili bilgileri göster. Örneğin
pacman -Qi firefox
-k : Bir pakedin sahip olduğu dosyaları kontrol et. Ayrıntılı kontrol için -kk kullanılabilir.
-l : Bir paketin sisteme kurduğu dosyaları göster
-o : Bir dosyanın sahibi olan paketi ara
-s : Kurulu paketlerin arasında bir paket ismi ara
-e : explicit : sistemin kurduğu değil, kullanıcı tarafından kurulan programları listele.
-q : Quiet. sürüm no gibi ek bilgileri gösterme, sadece paket isimlerini listele.
-n : Sadece ana repo'lardan kurulan programları listele.
-m: AUR'dan kurulan programları listele.
-d : dependencies. Başka bir programın alt bağımlığı olarak kurulan programları listele.
-t : unrequired. gereksinim duyulmayan paketleri listele.
-dt: genelde ihtiyaç duyulmayan paketleri listelemek için ikisi beraber kullanılır.

vlc kurulu mu değil mi öğrenmek için:
pacman -Qs vlc


Remove (-R) işlemleri için kullanılabilecek anahtarlar:
-s : recursive. bir paketi ve o paketle gelen tüm alt bağımlılıkları kaldırmak için
-u : unneeded. gereksiz paketleri de kaldır
-n : paketle beraber gelen sistem yapılandırma dosyalarını da sil
-s : yapılandırma dosyalarını da sil

Dolayısıyla thunderbird ile gelen bütün herşeyi kaldırmak için gereken komut:

pacman -Rnu thunderbird
olabilir.

Sync (-S) anahtarları:
-c : clean, yerel belleği temizle
-i : Kurulu olmayan paket ile ilgili bilgileri göster
-l : list
-q : quiet. Ekstra ayrıntılara (sürüm no, repo adı vs) girmeden sadece isimleri listele.
-s : search. depolarda arama yap.

Depolarda chromium aramak için
pacman -Ss chromium
-y : refresh. depolardan paket listesini tekrar indir (-Syy : liste yeniyse bile tekrar indir)
-u : upgrade. Tüm kurulu paketleri güncelle (-Suu: depodaki paket kurulu sürümden eskiyse bile güncelle)
-w : indir, ama kurma

File system (-F) işlemleri ile kullanılabilecek anahtar:
-s : search. Diskte kurulu bir dosyayı hangi paket kurmuş Bu artık (2024-02-27) yok. Bu işlev yerine sadece -F kullanılmalı.
-yy : force update. Henüz yeni güncellenmiş olsa da yine de paket listesini güncelle.
pacman -Fy
pacman -F libmozgtk.so
pacman -F /usr/lib/firefox/libmozgtk.so

Yukarıdaki ilk adımda pacman'in dosya/paket listesini güncellemesini, ikinci adımda libmozgtk.so dosyasının hangi paketlerde bulunabileceğini, üçüncü adımda ise tam yolu verilen dosyanın hangi paketlerde bulunabileceğini sorguluyoruz. Buna benzer bir işlev pkgfile ile de sunuluyor:

pkgfile lsb-release
pkgfile /etc/lsb-release
Genel bir anahtar: 
-p : işlemi yapmaktansa sadece işlemin uygulanacağı paket adını yaz.

Birkaç örnek üzerinden gidelim:

pacman -Syy // yerel paket verisini sunucularla eşleştir (sync)
pacman -Syu // tüm paketleri güncelle
pacman -Ss firefox // repository'lerde adında firefox geçen paket ara
pacman -Ssq ^firefox$ // tam adı firefox olan paketi ara, ayrıntısız
pacman -S firefox // firefox'u depolardan kur
pacman -S extra/firefox // belli bir depodan kur
pacman -U /home/user/package // sistemdeki yerel dosyayı kur
pacman -U http://github/... // bir URL'den dosya kur
pacman -S gnome // gnome paket grubunu kur
pacman -R firefox // bir paket kaldır
pacman -Rs apache // bir paket ve tüm alt bağımlılıklarını kaldır
pacman -Rns $(pacman -Qtdq) // sistemdeki tüm kullanılmayan paketleri temizle/kaldır
pacman -Ru gnome // tüm gnome paket grubunu kaldır
pacman -Q | more // tüm kurulu paketleri listele
pacman -Ql apache // apache tarafından kurulan tüm dosyaları listele
pacman -Ss chromium // depolarda bir paket ara
pacman -Qs firefox // kurulu paketlerin içinde bir paket ara
pacman -Si chromium // kurulu olmayan bir paket hakkında bilgileri göster
pacman -Qi apache // kurulu bir paket ile ilgili bilgileri göster
pacman -Qk // kurulu paketlerin dosya bütünlüğünü kontrol eder. 
Kurulu olması gereken dosyalar kurulu mu, yetkilendirme doğru mu, bakar.
pactree apache // bir paket ile ilgili bağımlılık ağacını göster
pacman -Qdt // artık gerekli olmayan paketleri listele
pacman -Sc  // cache verileri temizle
pacman -Scc // cache belleğe alınan paketleri sil
pacman -Qo netctl // netctl dosyasını hangi paket kurmuş göster
pacman-optimize // optimize pacman

Ayrıca pacman'in yapılandırmasını /etc/pacman.conf dosyasını düzenleyerek de yapabiliriz. Örneğin şu ayarlar mümkün:

Color # renkli çıkış
CheckSpace # indirme yaparken her seferinde diskte boş yer var mı kontrol et

VerbosePkgList # kurulacak paketler ile ilgili ayrıntılı bilgi
TotalDownload # dosya bazında değil, tüm indirmelerin ne kadarının tamamlandığını göster


2021-12-23 ek:

Kurulu çekirdekleri listelemek için:

$ pacman -Qsq ^linux | grep -E '^linux[0-9]{2,3}$'

veya

$ ls -l /boot/vmlinux*

ve hatta sadece Manjaro'ya özel

$ mhwd-kernel -li

kullanılabilir.

---

https://wiki.archlinux.org/title/Pacman/Tips_and_tricks