Temukan direktori yang tidak mengandung subdirektori

10

Saya menulis skrip adalah ksh. Perlu menemukan semua nama direktori langsung di bawah direktori saat ini yang hanya berisi file, bukan subdirektori.

Saya tahu bahwa saya dapat menggunakan ls -alRdan secara rekursif mengurai output untuk huruf pertama di bidang pertama ( duntuk direktori). Saya pikir awkadalah cara terbaik untuk menguraikan dan menemukan.

Misalnya, ls -aloutput sederhana di direktori saat ini:

   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
   

Ada 2 direktori dalam output ini: Publicdan Sites. Direktori Publictidak mengandung subdirektori, tetapi Sitestidak. Ada 3 subdirektori di Sites. Jadi saya hanya perlu mengulangi direktori yang tidak mengandung direktori di dalamnya. Dalam kasus saya, ini hanya Sites.

Nat Kup
sumber

Jawaban:

1

Anda tidak perlu menggunakan awksama sekali. Gunakan tes bawaan yang kshmenyediakan, seperti ini:

#!/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

Script kecil itu terlihat di semua direktori di direktori saat ini, dan memberi tahu Anda jika mereka hanya berisi file, tidak ada sub-direktori.

Bruce Ediger
sumber
14

Jika Anda dapat menggunakan finddan jika Anda bekerja pada "sistem file Unix normal" (yaitu, sebagaimana didefinisikan dalam find (1) di bawah -noleaf opsi deskripsi), maka perintah berikut dapat digunakan:

find . -type d -links 2

Setiap direktori memiliki setidaknya 2 nama (tautan keras): .dan namanya. Sub direktori, jika ada, akan ..menunjuk ke direktori induk, sehingga direktori dengan subdirektori N akan memiliki jumlah tautan keras sama dengan N + 2. Jadi, mencari direktori dengan jumlah tautan keras sama dengan 2, kami mencari direktori dengan subdirektori N = 0.

Jadi, jika Anda dapat menggunakan find, ini bisa dibilang metode tercepat dan jelas lebih unggul daripada loop in-shell atas isi direktori stat()masing-masing anggotanya.

intelfx
sumber
Tampaknya ini tidak berfungsi jika direktori tersebut berisi file apa pun.
user394
1
Ini bukan tentang entri dalam daftar direktori, ini tentang tautan keras yang merujuk pada inode direktori. Misalnya, jika /some/directorymemiliki inode # 12345678, jika tidak memiliki sub-direktori, akan ada tepat 2 tautan keras ke inode itu: /some/directory/.dan /some/directory. Ini berfungsi apakah ada file dalam direktori atau tidak.
telcoM
Layak disebutkan bahwa BTRFS bukan "sistem file Unix normal" dalam hal ini: direktori selalu memiliki jumlah tautan 1, sayangnya. (Tapi .dan foo/..memiliki nomor inode yang sama.)
Peter Cordes
3

*/cocok dengan subdirektori dari direktori saat ini. Ini termasuk tautan simbolis ke direktori, yang mungkin atau tidak Anda inginkan.

Di ksh93, menambahkan ~(N)di awal pola membuatnya diperluas ke daftar kosong jika tidak ada kecocokan. Tanpa ini, polanya tetap tidak berubah jika tidak ada kecocokan.

Fungsi ksh93 berikut mencantumkan subdirektori dari direktori saat ini yang tidak berisi subdirektori atau tautan ke direktori.

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
Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

jika saya tidak salah paham dengan Anda, Anda hanya ingin mencari file di direktori bukan di subdirektori. Jika ini niat Anda, inilah solusinya

find . -type f

jika Anda ingin mencari selain file biasa (seperti memblokir file perangkat, file perangkat karakter, dll.) lalu lihat halaman manual untuk findperintah dan cari jenis kata kunci pada halaman itu. Anda akan melihat tipe file yang berbeda, termasuk file dan direktori biasa dll.

Semoga ini yang Anda cari

MelBurslan
sumber
Tidak, itu bukan pertanyaan sama sekali. Sudah cukup jelas begitu Anda s / katalog / direktori / g. Nat Kup mencari direktori yang tidak mengandung subdirektori.
Gilles 'SO- stop being evil'