Linux'ta Bir Dizin Ağacında Geçiş Nasıl Yapılır?

Yayınlanan: 2022-07-21
Bir bash istemi gösteren Linux dizüstü bilgisayar
fatmawati achmad zaenuri/Shutterstock.com

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.

Açıklanan Linux Dizin Yapısı
İLGİLİ Linux Dizin Yapısı, Açıklaması

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ı 

Ubuntu'ya ağaç yükleme

Fedora'da şunu kullanın:

 sudo dnf kurulum ağacı 

Fedora'ya ağaç yükleme

Manjaro'da komut şudur:

 sudo pacman -Sy ağacı 

Manjaro'ya ağaç yükleme

tree parametresiz kullanmak, ağacı geçerli dizinin altına çeker.

 ağaç 

Geçerli dizinde çalışan ağaç

Komut satırında tree bir yol iletebilirsiniz.

 ağaç işi 

Belirli bir dizinde çalışan ağaç

-d (dizinler) seçeneği, dosyaları hariç tutar ve yalnızca dizinleri gösterir.

 ağaç -d işi 

Çalışan ağaç ve yalnızca dizinleri gösteren

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.

Garip bir dizin adı

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:" {} \; 

dizinleri özyinelemeli olarak bulmak için find komutunu kullanma

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ı tekrar tekrar bulmak için find komutunu kullanma

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 {} \; 

wc komutuyla find kullanma

İ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 

recurse.sh betiğini çalıştırılabilir yapma

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.

Primer: Bash Döngüler: için, süre ve kadar
İLGİLİ Astar: Bash Döngüler: için, süre ve kadar

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 ifadesinin else 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ı 

Dizinleri en sığdan en derine işleme

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ı 

Dizinleri en derinden en sığa doğru işleme

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?