Linux'ta Bir Dizin Ağacında Geçiş Nasıl Yapılır?
Yayınlanan: 2022-07-21
Linux'taki dizinler, dosyaları farklı, ayrı koleksiyonlarda gruplandırmanıza izin verir. Dezavantajı, tekrarlayan bir görevi gerçekleştirmek için bir dizinden dizine geçmenin sıkıcı hale gelmesidir. Bunu nasıl otomatikleştireceğiniz aşağıda açıklanmıştır.
Dizinler Hakkında Her Şey
Linux ile tanıştığınızda öğrendiğiniz ilk komut muhtemelen ls
, ancak cd
bunun çok gerisinde olmayacaktır. Dizinleri ve özellikle iç içe alt dizinler arasında nasıl dolaşılacağını anlamak, Linux'un kendisini nasıl organize ettiğini ve kendi çalışmalarınızı dosyalar, dizinler ve alt dizinler halinde nasıl organize edebileceğinizi anlamanın temel bir parçasıdır.
Bir dizin ağacı kavramını ve bunlar arasında nasıl hareket edileceğini kavramak, kendinizi Linux ortamına alıştırırken geçtiğiniz birçok küçük dönüm noktasından biridir. Bir yol ile cd
kullanmak sizi o dizine götürür. cd ~
veya cd
gibi kısayollar tek başına sizi ana dizininize geri götürür ve cd ..
sizi dizin ağacında bir seviye yukarı taşır. Basit.
Ancak, bir dizin ağacının tüm dizinlerinde bir komut çalıştırmanın eşit derecede basit bir yolu yoktur. Bu işlevi elde etmenin farklı yolları vardır, ancak bu amaca adanmış standart bir Linux komutu yoktur.
ls
gibi bazı komutlar, onları özyinelemeli çalışmaya zorlayan komut satırı seçeneklerine sahiptir, yani bir dizinde başlarlar ve o dizinin altındaki tüm dizin ağacı boyunca metodik olarak çalışırlar. ls
için -R
(özyinelemeli) seçeneğidir.
Özyinelemeyi desteklemeyen bir komut kullanmanız gerekiyorsa, özyineleme işlevini kendiniz sağlamanız gerekir. İşte bunu nasıl yapacağınız.
İLGİLİ: Bilmeniz Gereken 37 Önemli Linux Komutu
ağaç Komutanlığı
tree
komutu elimizdeki görevde bize yardımcı olmayacak, ancak bir dizin ağacının yapısını görmeyi kolaylaştırıyor. Dizin ağacını oluşturan dizinlere ve alt dizinlere ve bunların ağaçtaki göreli konumlarına anında genel bir bakış elde edebilmemiz için ağacı bir terminal penceresinde çizer.
tree
kurmanız gerekecek.
Ubuntu'da şunu yazmanız gerekir:
sudo apt kurulum ağacı
Fedora'da şunu kullanın:
sudo dnf kurulum ağacı
Manjaro'da komut şudur:
sudo pacman -Sy ağacı
tree
parametresiz kullanmak, ağacı geçerli dizinin altına çeker.
ağaç
Komut satırında tree
bir yol iletebilirsiniz.
ağaç işi
-d
(dizinler) seçeneği, dosyaları hariç tutar ve yalnızca dizinleri gösterir.
ağaç -d işi
Bu, bir dizin ağacının yapısını net bir şekilde görmenin en uygun yoludur. Burada gösterilen dizin ağacı, aşağıdaki örneklerde kullanılandır. Beş metin dosyası ve sekiz dizin vardır.
Çıktıyı ls'den Traverse Dizinlerine Ayrıştırmayın
İlk düşünceniz, eğer ls
bir dizin ağacında yinelemeli olarak geçebiliyorsa, neden sadece bunu yapmak için ls
kullanmıyorsunuz ve çıktıyı dizinleri ayrıştıran ve bazı eylemler gerçekleştiren başka komutlara aktarmıyorsunuz?
ls
çıktısının ayrıştırılması kötü uygulama olarak kabul edilir. Linux'ta her türden garip karakter içeren dosya ve dizin adları oluşturma yeteneği nedeniyle, genel, evrensel olarak doğru bir ayrıştırıcı oluşturmak çok zor hale gelir.
Asla bilerek bu kadar akıl almaz bir dizin adı oluşturamazsınız, ancak bir komut dosyasındaki veya bir uygulamadaki bir hata olabilir.
Meşru ancak kötü düşünülmüş dosya ve dizin adlarını ayrıştırmak hataya açıktır. Kullanabileceğimiz, ls
çıktısını yorumlamaya güvenmekten daha güvenli ve çok daha sağlam başka yöntemler de var.
Bul komutunu kullanma
find
komutunun yerleşik özyinelemeli yetenekleri vardır ve ayrıca bizim için komutları çalıştırma yeteneğine de sahiptir. Bu, güçlü tek gömlekler oluşturmamızı sağlar. Gelecekte kullanmak isteyebileceğiniz bir şeyse, tek astarınızı bir takma ada veya bir kabuk işlevine dönüştürebilirsiniz.
Bu komut, dizinleri arayarak dizin ağacında yinelemeli olarak döner. Her dizin bulduğunda dizinin adını yazdırır ve aramayı o dizinde tekrarlar. Bir dizinde aramayı tamamladıktan sonra o dizinden çıkar ve aramayı kendi üst dizininde sürdürür.
iş bul -type d -execdir echo "In:" {} \;
Dizinlerin listelendiği sıraya göre aramanın ağaçta nasıl ilerlediğini görebilirsiniz. tree
komutunun çıktısını tek satırlı find
çıktısıyla karşılaştırarak, find'ın alt dizinleri olmayan bir dizine ulaşana kadar sırayla her dizini ve alt dizini nasıl find
göreceksiniz. Daha sonra bir seviye yukarı gider ve aramaya o seviyede devam eder.
İşte komutun nasıl oluşturulduğu.
- bul :
find
komutu. - work : Aramanın başlatılacağı dizin. Bu bir yol olabilir.
- -type d : Dizinleri arıyoruz.
- -execdir : Bulduğumuz her dizinde bir komut çalıştıracağız.
- echo “In:” {} : Bu komuttur., Dizinin adını terminal penceresine tekrarlıyoruz. “{}” geçerli dizinin adını tutar.
- \; : Bu, komutu sonlandırmak için kullanılan noktalı virgüldür. Bash'in doğrudan yorumlamaması için ters eğik çizgi ile kaçmamız gerekiyor.
Küçük bir değişiklikle, find komutunun bir arama ipucuyla eşleşen dosyaları döndürmesini sağlayabiliriz. -name seçeneğini ve bir arama ipucunu eklememiz gerekiyor. Bu örnekte, “*.txt” ile eşleşen ve adlarını terminal penceresine ekleyen metin dosyaları arıyoruz.

işi bul -name "*.txt" -type f -execdir echo "Bulunan:" {} \;
Dosyaları mı yoksa dizinleri mi aradığınız, ne elde etmek istediğinize bağlıdır. Her dizinin içinde bir komut çalıştırmak için -type d
kullanın. Eşleşen her dosyada bir komut çalıştırmak için -type f
kullanın.
Bu komut, başlangıç dizini ve alt dizinlerindeki tüm metin dosyalarındaki satırları sayar.
işi bul -name "*.txt" -type f -execdir wc -l {} \;
İLGİLİ: Linux'ta find Komutu Nasıl Kullanılır
Bir Komut Dosyası ile Dizin Ağaçlarında Geçiş Yapma
Bir komut dosyası içindeki dizinleri geçmeniz gerekiyorsa, komut dosyanızın içindeki find
komutunu kullanabilirsiniz. Özyinelemeli aramaları kendiniz yapmanız gerekiyorsa veya sadece yapmak istiyorsanız, bunu da yapabilirsiniz.
#!/bin/bash shopt -s dotglob nullglob işlev özyinelemeli { yerel current_dir dir_or_file 1 $'daki current_dir için; yapmak echo "Dizin komutu:" $current_dir "$current_dir"/* içindeki dir_or_file için; yapmak if [[ -d $dir_or_file ]]; sonra özyinelemeli "$dir_or_file" başka wc $dir_or_file fi tamamlamak tamamlamak } özyinelemeli "$1"
Metni bir düzenleyiciye kopyalayın ve “recurse.sh” olarak kaydedin, ardından yürütülebilir hale getirmek için chmod
komutunu kullanın.
chmod +x recurse.sh
Komut dosyası, dotglob
ve nullglob
olmak üzere iki kabuk seçeneği belirler.
dotglob
ayarı, nokta ile başlayan dosya ve dizin adları anlamına gelir “ .
”, joker karakter arama terimleri genişletildiğinde döndürülecektir. Bu, arama sonuçlarımıza gizli dosya ve dizinleri dahil ettiğimiz anlamına gelir.
nullglob
ayarı, herhangi bir sonuç bulamayan arama kalıplarının boş veya boş bir dize olarak kabul edildiği anlamına gelir. Arama teriminin kendisini varsayılan olarak ayarlamazlar. Başka bir deyişle, yıldız işareti “ *
“ kullanarak bir dizindeki her şeyi arıyorsak, ancak sonuç yoksa, yıldız işareti içeren bir dize yerine boş bir dize alırız. Bu, komut dosyasının yanlışlıkla "*" adlı bir dizini açmaya çalışmasını veya "*" öğesini bir dosya adı olarak ele almasını engeller.
Ardından, recursive
adlı bir işlevi tanımlar. İşte ilginç şeyler burada oluyor.
current_dir
ve dir_or_file
adlı iki değişken bildirilir. Bunlar yerel değişkenlerdir ve yalnızca işlev içinde başvurulabilir.
İşlev içinde ayrıca $1
adlı bir değişken de kullanılır. Bu, çağrıldığında işleve iletilen ilk (ve tek) parametredir.
Komut dosyası, biri diğerinin içine yerleştirilmiş iki for
döngüsü kullanır. İlk (dış) for
döngüsü iki şey için kullanılır.
Biri, her dizinde gerçekleştirmek istediğiniz komutu çalıştırmaktır. Burada tek yaptığımız, dizinin adını terminal penceresine tekrarlamak. Elbette herhangi bir komut veya komut dizisini kullanabilir veya başka bir komut dosyası işlevini çağırabilirsiniz.
Dış for döngüsünün yaptığı ikinci şey, bulabildiği tüm dosya sistemi nesnelerini kontrol etmektir - bunlar ya dosyalar ya da dizinler olacaktır. Bu, iç for
döngüsünün amacıdır. Sırayla, her dosya veya dizin adı dir_or_file
değişkenine iletilir.
dir_or_file
değişkeni daha sonra bir dizin olup olmadığını görmek için if ifadesinde test edilir.
- Eğer öyleyse, fonksiyon kendini çağırır ve dizinin adını parametre olarak iletir.
-
dir_or_file
değişkeni bir dizin değilse, bir dosya olmalıdır. Dosyaya uygulanmasını istediğiniz herhangi bir komut,if
ifadesininelse
yan tümcesinden çağrılabilir. Aynı komut dosyası içinde başka bir işlevi de çağırabilirsiniz.
Komut dosyasındaki son satır recursive
işlevi çağırır ve ilk komut satırı parametresinde $1
arama yapılacak başlangıç dizini olarak geçer. Bu, tüm süreci başlatan şeydir.
Senaryoyu çalıştıralım.
./recurse.sh çalışması
Dizinler arasında geçiş yapılır ve komut dosyasında her dizinde bir komutun çalıştırılacağı nokta “Directory command for:” satırlarıyla belirtilir. Bulunan dosyalar, satırları, kelimeleri ve karakterleri saymak için wc
komutunu çalıştırır.
İşlenen ilk dizin “iş” ve ardından ağacın iç içe geçmiş her dizin dalı.
Dikkat edilmesi gereken ilginç bir nokta da, dizine özgü komutları döngünün iç kısmından aşağısına taşıyarak dizinlerin işlenme sırasını değiştirebilmenizdir.
“Directory command for:” satırını içteki for
döngüsü done
sonraya taşıyalım.
#!/bin/bash shopt -s dotglob nullglob işlev özyinelemeli { yerel current_dir dir_or_file 1 $'daki current_dir için; yapmak "$current_dir"/* içindeki dir_or_file için; yapmak if [[ -d $dir_or_file ]]; sonra özyinelemeli "$dir_or_file" başka wc $dir_or_file fi tamamlamak echo "Dizin komutu:" $current_dir tamamlamak } özyinelemeli "$1"
Şimdi betiği bir kez daha çalıştıracağız.
./recurse.sh çalışması
Bu sefer dizinler, ağacın dallarını yedekleyerek, önce en derin seviyelerden kendilerine uygulanan komutlara sahiptir. Komut dosyasına parametre olarak iletilen dizin en son işlenir.
Önce daha derin dizinlerin işlenmesi önemliyse, bunu şu şekilde yapabilirsiniz.
Özyineleme Garip
Bu, kendi telefonunuzdan kendinizi aramak ve tekrar tekrar karşılaştığınızda kendinize söylemeniz için kendinize bir mesaj bırakmak gibidir.
Faydalarını kavramanız biraz çaba gerektirebilir, ancak anladığınızda, bunun zor problemlerin üstesinden gelmenin programlı olarak zarif bir yolu olduğunu göreceksiniz.
İLGİLİ: Programlamada Özyineleme Nedir ve Nasıl Kullanırsınız?