Alt dizin içermeyen dizinleri bulma


10

Senaryo yazıyorum ksh. Tüm dizin adlarını, alt dizinleri değil, yalnızca dosyaları içeren geçerli dizinin hemen altında bulmanız gerekir.

Ben ls -alRilk alanında ( dbir dizin için) ilk harf için çıktısı özyineli olarak ve yinelemeli ayrıştırmak biliyorum . Bence awkayrıştırmanın ve bulmanın en iyi yolu bu.

Örneğin ls -al, geçerli dizinde basit bir çıktı:

   drwxr-xr-x  22 af      staff    748 18 Mar 22:21 .
   drwxr-xr-x   5 root    admin    170 17 Mar 18:03 ..
   -rw-------   1 af      staff      3 17 Mar 16:37 .CFUserTextEncoding
   drwxr-xr-x   5 af      staff    170 17 Mar 17:12 Public
   drwxr-xr-x   9 af      staff    306 18 Mar 17:40 Sites
   -rw-------   1 af      staff      3 17 Mar 16:37 textd
   

Bu çıktıda 2 dizin vardır: Publicve Sites. Dizin Publicalt dizin içermiyor, ancak içeriyor Sites. 'De 3 alt dizin var Sites. Bu yüzden sadece içinde dizin içermeyen dizinleri yankılamam gerekiyor. Benim durumumda, bu sadece Sites.

Yanıtlar:


1

Hiç kullanmanıza gerek yok awk. Bunun kshgibi bir şey sağlayan yerleşik testleri kullanın :

#!/bin/ksh

for NAME in *
do
    FOUND=no
    if [[ -d $NAME && $NAME != '.' && $NAME != '..' ]]
    then
        for SUBNAME in $NAME/*
        do
            if [[ -d $SUBNAME ]]
            then
                FOUND=yes
                break
            fi
        done
        if [[ $FOUND == no ]]
        then
            echo Found only files in $NAME
        fi
    fi
done

Bu küçük komut dosyası, geçerli dizindeki tüm dizinlere bakar ve yalnızca dosya içerip içermediklerini, alt dizin olmadığını gösterir.


14

Kullanabiliyorsanız findve "normal Unix dosya sistemi" üzerinde (yani, -noleaf seçenek açıklaması altındaki find (1) öğesinde tanımlandığı gibi) üzerinde çalışıyorsanız, aşağıdaki komut kullanılabilir:

find . -type d -links 2

Her dizinin en az 2 adı (sabit bağlantılar): .ve adı. Varsa, alt dizinleri ..üst dizine işaret edecektir, bu nedenle N alt dizinleri olan bir dizinin N + 2'ye eşit sabit bağlantı sayısı olacaktır. Böylece, sabit bağlantı sayısı 2'ye eşit olan dizinleri ararken, N = 0 alt dizinleri olan dizinleri ararız.

Bu nedenle, eğer kullanabiliyorsanız find, bu muhtemelen en hızlı yöntemdir ve stat()her üyenin üyelerini içeren dizin içeriği üzerindeki kabuk içi döngülerden açıkça üstündür .


Dizin herhangi bir dosya içeriyorsa bu işe yaramıyor gibi görünüyor.
user394 26:18

1
Dizin listesindeki girdilerle değil, dizinin inode'una atıfta bulunan sabit bağlantılar ile ilgilidir. Örneğin, /some/directory# 12345678 inode değeri varsa , alt dizinleri yoksa, o inode ile tam olarak 2 sabit bağlantı olacaktır: /some/directory/.ve /some/directory. Dizinde herhangi bir dosya bulunup bulunmadığı çalışır.
telcoM

BTRFS'nin bu açıdan bir "normal Unix dosya sistemi" olmadığından bahsetmeye değer: dizinler maalesef her zaman 1 bağlantı sayısına sahiptir. (Ama .ve foo/..aynı inode numarası var.)
Peter Cordes

3

*/geçerli dizinin alt dizinleriyle eşleşir. Bu, isteyebileceğiniz veya istemeyebileceğiniz dizinlere sembolik bağlantılar da içerir.

Ksh93'te, ~(N)desenin başına ekleme , eşleşme yoksa boş listeye genişler. Bu olmadan, eşleşme yoksa desen değişmeden kalır.

Aşağıdaki ksh93 işlevi, herhangi bir alt dizin veya bir dizine bağlantı içermeyen geçerli dizinlerin alt dizinlerini listeler.

list_leaf_directories () {
  local FIGNORE='.?(.)'        # don't ignore dot files
  local d
  for d in */; do
    [[ -L $d ]] || continue;   # skip symbolic links
    set -- ~(N)"$d"/*/
    if ((!$#)); then echo "$d"; fi
  done
done

0

eğer sizi yanlış anlamıyorsam, sadece alt dizinleri değil dizindeki dosyaları bulmak istersiniz. Eğer niyetiniz buysa, işte çözüm

find . -type f

normal dosyalar dışında (blok cihazı dosyaları, karakter cihazı dosyaları vb. gibi) bulmak istiyorsanız findkomut için man sayfasına bakın ve o sayfada type anahtar sözcüğünü arayın . Normal dosyalar ve dizinler gibi farklı dosya türlerini göreceksiniz.

Umarım aradığın şey budur


Hayır, asıl soru bu değil. / Catalog / directory / g komutunu girdikten sonra oldukça açıktır. Nat Kup, alt dizin içermeyen dizinleri arıyor.
Gilles 'SO- kötü olmayı kes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.