Trova le directory che non contengono sottodirectory


10

Sto scrivendo la sceneggiatura è ksh. È necessario trovare tutti i nomi delle directory direttamente nella directory corrente che contengono solo file, non sottodirectory.

So che potrei usare ls -alRe analizzare ricorsivamente l'output per la prima lettera nel primo campo ( dper una directory). Penso che awksia il modo migliore per analizzare e trovare.

Ad esempio, un semplice ls -aloutput nella directory corrente:

   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
   

Ci sono 2 directory in questo output: Publice Sites. La directory Publicnon contiene sottodirectory, ma lo Sitesfa. Ci sono 3 sottodirectory in Sites. Quindi ho bisogno di fare eco solo alle directory che non contengono directory in esse. Nel mio caso, questo è solo Sites.

Risposte:


1

Non è necessario utilizzare awkaffatto. Usa i test integrati che kshforniscono, qualcosa del genere:

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

Quel piccolo script cerca in tutte le directory nella directory corrente e ti dice se contengono solo file, nessuna sottodirectory.


14

Se sei in grado di usare finde se stai lavorando su un "normale filesystem Unix" (cioè, come definito in find (1) nella descrizione dell'opzione -neaeaf ), puoi usare il seguente comando:

find . -type d -links 2

Ogni directory ha almeno 2 nomi (hard link): .e il suo nome. Le sue sottodirectory, se presenti, avranno un ..puntamento alla directory principale, quindi una directory con N sottodirectory avrà un conteggio dei collegamenti reali pari a N + 2. Quindi, alla ricerca di directory con un conteggio hard link pari a 2, cerchiamo directory con sottodirectory N = 0.

Quindi, se puoi usarlo find, questo è probabilmente il metodo più veloce e ovviamente superiore ai loop in-shell sui contenuti della directory in stat()ciascuno dei suoi membri.


Questo non sembra funzionare se la directory contiene file.
user394,

1
Non si tratta di voci nell'elenco delle directory, si tratta di hard link che si riferiscono all'inode della directory. Ad esempio, se /some/directoryha l'inode # 12345678, se non ha sottodirectory, ci saranno esattamente 2 hard link a quell'inode: /some/directory/.e /some/directory. Funziona indipendentemente dalla presenza di file nella directory.
telcoM,

Vale la pena ricordare che BTRFS non è un "normale filesystem Unix" sotto questo aspetto: purtroppo le directory hanno sempre un numero di collegamenti pari a 1. (Ma .e foo/..hanno lo stesso numero di inode.)
Peter Cordes

3

*/corrisponde alle sottodirectory della directory corrente. Ciò include collegamenti simbolici alle directory, che è possibile o meno desiderare.

In ksh93, l'aggiunta ~(N)all'inizio del modello lo fa espandere all'elenco vuoto se non c'è corrispondenza. Senza questo, il modello rimane invariato se non c'è corrispondenza.

La seguente funzione ksh93 elenca le sottodirectory delle directory correnti che non contengono alcuna sottodirectory o collegamento a una directory.

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

se non ti sto fraintendendo, vuoi solo trovare i file nella directory e non nelle sottodirectory. Se questa è la tua intenzione, ecco la soluzione

find . -type f

se si desidera trovare file diversi dai normali (come file di dispositivo a blocchi, file di dispositivo a caratteri, ecc.), consultare la pagina man per il findcomando e cercare la parola chiave type in quella pagina. Vedrai diversi tipi di file, inclusi file e directory regolari ecc.

Spero che questo sia ciò che stai cercando


No, questa non è affatto la domanda. È ragionevolmente chiaro una volta che hai / catalog / directory / g. Nat Kup è alla ricerca di directory che non contengano sottodirectory.
Gilles 'SO- smetti di essere malvagio' il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.