Verificare dallo script di shell se una directory contiene file


116

Da uno script di shell, come posso verificare se una directory contiene file?

Qualcosa di simile a questo

if [ -e /some/dir/* ]; then echo "huzzah"; fi;

ma che funziona se la directory contiene uno o più file (quello sopra funziona solo con esattamente 0 o 1 file).


Per quello che vale il tuo esempio, il bene fa quello che vuoi in ksh e zsh
Dave Webb

2
@ DaveWebb No, non lo fa. Se il glob si espande in più di una parola, il test zsh riporta "test: troppi argomenti".
Jens

"huzzah" significa "la directory non è vuota".
funroll

Se la directory contiene solo una sottodirectory vuota, conta come "file contenenti"?
Keith Thompson

Risposte:


72

Le soluzioni finora utilizzate ls. Ecco una soluzione tutta bash:

#!/bin/bash
shopt -s nullglob dotglob     # To include hidden files
files=(/some/dir/*)
if [ ${#files[@]} -gt 0 ]; then echo "huzzah"; fi

8
fintanto che ti ricordi di riportare le opzioni al loro valore originale alla fine dello script :)
Jean

Questa è una versione leggermente migliorata che si occupa di ripristinare le impostazioni di bash:shopt -q nullglob || resetnullglob=1; shopt -s nullglob; shopt -q dotglob || resetdotglob=1; shopt -s dotglob; files=(/some/dir/*); [ "$files" ] && echo "wowzers"; [ "$resetdotglob" ] && shopt -u dotglob; [ "$resetnullglob" ] && shopt -u nullglob;
user123444555621

12
Perché non utilizzare una subshell per ripristinare le impostazioni:files=$(shopt -s nullglob;shopt -s dotglob;echo /some/dir/*)
teambob

7
@teambob se si utilizza una sotto-shell: files=$(shopt -s nullglob;shopt -s dotglob;echo /some/dir/*) allora l'istruzione if dovrebbe cambiare in if [ ${#files} -gt 0 ];o forse hai semplicemente dimenticato la () attorno al comando della sotto-shell? files=($(shopt -s nullglob;shopt -s dotglob;echo /some/dir/*))
stoutyhk

2
@stoutyhk $ (...) ripristina le impostazioni, non è richiesta alcuna subshell separata. L'uso di $ (...) genera una nuova istanza della shell. L'ambiente di questa nuova istanza viene buttato via una volta terminato il comando. Modifica: trovato un riferimento tldp.org/LDP/abs/html/commandsub.html "La sostituzione del comando richiama una subshell."
teambob

140

Tre migliori trucchi


shopt -s nullglob dotglob; f=your/dir/*; ((${#f}))

Questo trucco è al 100% bashe invoca (genera) un sub-shell. L'idea è di Bruno De Fraine e migliorata dal commento di teambob .

files=$(shopt -s nullglob dotglob; echo your/dir/*)
if (( ${#files} ))
then
  echo "contains files"
else 
  echo "empty (or does not exist or is a file)"
fi

Nota: nessuna differenza tra una directory vuota e una inesistente (e anche quando il percorso fornito è un file).

Esiste un'alternativa simile e ulteriori dettagli (e altri esempi) nelle FAQ "ufficiali" per il canale IRC #bash :

if (shopt -s nullglob dotglob; f=(*); ((${#f[@]})))
then
  echo "contains files"
else 
  echo "empty (or does not exist, or is a file)"
fi

[ -n "$(ls -A your/dir)" ]

Questo trucco è ispirato all'articolo di nixCraft pubblicato nel 2007. Aggiungi 2>/dev/nullper sopprimere l'errore di output "No such file or directory".
Vedere anche la risposta di Andrew Taylor (2008) e la risposta di gr8can8dian (2011).

if [ -n "$(ls -A your/dir 2>/dev/null)" ]
then
  echo "contains files (or is a file)"
else
  echo "empty (or does not exist)"
fi

o la versione bashism di una riga:

[[ $(ls -A your/dir) ]] && echo "contains files" || echo "empty"

Nota: ls ritorna $?=2quando la directory non esiste. Ma nessuna differenza tra un file e una directory vuota.


[ -n "$(find your/dir -prune -empty)" ]

Quest'ultimo trucco è ispirato dalla risposta di gravstar dove -maxdepth 0è sostituito -prunee migliorato dal commento di phils .

if [ -n "$(find your/dir -prune -empty 2>/dev/null)" ]
then
  echo "empty (directory or file)"
else
  echo "contains files (or does not exist)"
fi

una variazione che utilizza -type d:

if [ -n "$(find your/dir -prune -empty -type d 2>/dev/null)" ]
then
  echo "empty directory"
else
  echo "contains files (or does not exist or is not a directory)"
fi

Spiegazione:

  • find -pruneè simile find -maxdepth 0all'utilizzo di meno caratteri
  • find -empty stampa le directory e i file vuoti
  • find -type d stampa solo le directory

Nota: puoi anche sostituire [ -n "$(find your/dir -prune -empty)" ]solo con la versione abbreviata di seguito:

if [ `find your/dir -prune -empty 2>/dev/null` ]
then
  echo "empty (directory or file)"
else
  echo "contains files (or does not exist)"
fi

Quest'ultimo codice funziona nella maggior parte dei casi, ma tieni presente che percorsi dannosi potrebbero esprimere un comando ...


2
Penso che tu possa semplificare l'opzione find a [ -n "$(find "your/dir" -prune -empty)" ], per evitare la ripetizione del percorso della directory.
phils

Durante l'utilizzo if [ ``ls -A your/dir`` ]in uno script sono giunto alla conclusione che funziona bene per una directory con 0, 1 o 2 sottodirectory, ma fallisce per una directory con più di 2 sottodirectory. line 17: [: 20150424-002813: unary operator expecteddov'era 20150424-002813uno dei nomi delle directory. La shell usata era /bin/bash/. ls "$destination" | tail -1
Christophe De Troyer,

Ciao @ChristopheDeTroyer, non riesco a riprodurre il tuo problema. Da parte mia if [ ``ls -A my/dir`` ]esce per errore bash: [: -A: binary operator expected. Testato sulle versioni bash 4.1.2 e 4.2.53.
olibre

1
Bene, ero principalmente motivato a commentare a causa dell'incongruenza percepita (poiché la -nvariante era nel titolo ma poi non nel paragrafo sottostante). Quindi, sì, va bene.
maxschlepzig

1
Sto usando la tua soluzione -n, ma il mio script si lamenta ancora di questo ls: cannot access '/path': No such file or directory. C'è un modo per sopprimere questo messaggio? Vorrei fallire silenziosamente lì.
Freedo

48

Che ne dici di quanto segue:

if find /some/dir/ -maxdepth 0 -empty | read v; then echo "Empty dir"; fi

In questo modo non è necessario generare un elenco completo dei contenuti della directory. Il readè sia per scartare l'uscita e rendere l'espressione valutata come vera solo quando qualcosa è letta (cioè /some/dir/viene trovato vuota find).


3
o semplicementefind /some/dir/ -maxdepth 0 -empty -exec echo "huzzah" \;
raddoppia

5
+1 Questa è la soluzione più elegante. Non implica l'analisi lsdell'output e non si basa su funzionalità della shell non predefinite.

7
Tuttavia, si basa su non standard -maxdepthe -emptyprimari.
chepner

21

Provare:

if [ ! -z `ls /some/dir/*` ]; then echo "huzzah"; fi

Questo ha funzionato per me, ma non posso formattare questo messaggio d * mn !!! <br> export tmp = /bin/ls <some_dir>/* 2> /dev/nullif [! -z "$ tmp"]; quindi echo Something is there fi
AndrewStone

1
Per gli idioti di Bash come me, se vuoi controllare il contrario - che la directory è vuota - usa semplicemente if [-z ls /some/dir/*]; poi echo "huzzah"; fi
Chris Moschini

4
Puoi usare -ninvece di ! -z(sono entrambi equivalenti, ma perché non usare la forma più breve quando esiste).
n.

Con ZSH questo esempio genera un errore, l'idea è di non avere l'errore generato ... BigGray% if [ ! -z ls / some / dir / * `]; poi echo "huzzah"; fi zsh: nessuna corrispondenza trovata: / some / dir / * `
Hvisage

non funziona per me senza virgolette doppie in giro ls...in bash
letmutx

15
# Works on hidden files, directories and regular files
### isEmpty()
# This function takes one parameter:
# $1 is the directory to check
# Echoes "huzzah" if the directory has files
function isEmpty(){
  if [ "$(ls -A $1)" ]; then
    echo "huzzah"
  else 
    echo "has no files"
  fi
}

15

Fai attenzione alle directory con molti file! Potrebbe volerci un po 'di tempo per valutare il lscomando.

IMO la soluzione migliore è quella che utilizza

find /some/dir/ -maxdepth 0 -empty

8
DIR="/some/dir"
if [ "$(ls -A $DIR)" ]; then
     echo 'There is something alive in here'
fi

6

Potresti confrontare l'output di questo?

 ls -A /some/dir | wc -l

4
# Verifica se una directory contiene file non nascosti.
#
# utilizzo: if isempty "$ HOME"; quindi echo "Welcome home"; fi
#
è vuoto() {
    per _ief in $ 1 / *; fare
        if [-e "$ _ief"]; poi
            ritorno 1
        fi
    fatto
    return 0
}

Alcune note di implementazione:

  • Il forciclo evita una chiamata a un lsprocesso esterno . Legge ancora una volta tutte le voci della directory. Questo può essere ottimizzato solo scrivendo un programma C che usa readdir () esplicitamente.
  • L' test -einterno del ciclo cattura il caso di una directory vuota, nel qual caso alla variabile _iefverrà assegnato il valore "somedir / *". Solo se quel file esiste la funzione restituirà "non vuoto"
  • Questa funzione funzionerà in tutte le implementazioni POSIX. Ma tieni presente che Solaris / bin / sh non rientra in quella categoria. La sua testimplementazione non supporta la -ebandiera.

1
Questo ignorerebbe i dotfile nella directory se dotglobnon è impostato -shopt -s dotglob
l0b0

4

Questo mi dice se la directory è vuota o se non lo è, il numero di file che contiene.

directory="/some/dir"
number_of_files=$(ls -A $directory | wc -l)

if [ "$number_of_files" == "0" ]; then
    echo "directory $directory is empty"
else
    echo "directory $directory contains $number_of_files files"
fi

Qualcuno può spiegarmi perché sono stato svalutato? Se sto scrivendo craps, vorrei sapere perché;)
Daishi

1
Non ho votato per difetto, ma immagino sia perché stai analizzando l'output dils .
Toby Speight

l'articolo collegato non è chiaro? In tal caso, inviare un'e-mail all'autore (non a me).
Toby Speight

1
@TobySpeight Capisco il punto. Ma in questo caso sto contando le righe non enumerandole. Dovrebbe dare un risultato falso solo se il nome di un file contiene una nuova riga. E se i nomi dei file contengono nuove righe, qualcosa di molto più importante deve essere andato a puttane da qualche parte;)
Daishi,

3

Questa potrebbe essere una risposta davvero tardiva, ma ecco una soluzione che funziona. Questa riga riconosce solo l'esistenza dei file! Non ti darà un falso positivo se esistono directory.

if find /path/to/check/* -maxdepth 0 -type f | read
  then echo "Files Exist"
fi

2
dir_is_empty() {
   [ "${1##*/}" = "*" ]
}

if dir_is_empty /some/dir/* ; then
   echo "huzzah"
fi

Supponiamo di non avere un file denominato *in /any/dir/you/check, dovrebbe funzionare su bash dash posh busybox she zshma (per zsh) require unsetopt nomatch.

Le prestazioni dovrebbero essere paragonabili a quelle lsche usano *(glob), immagino che sarà lento sulle directory con molti nodi (il mio /usr/bincon oltre 3000 file non è andato così lento), utilizzerà almeno la memoria sufficiente per allocare tutte le directory / nomi di file (e altro) poiché sono tutti passati (risolti) alla funzione come argomenti, alcune shell probabilmente hanno limiti sul numero di argomenti e / o sulla lunghezza degli argomenti.

Sarebbe bello avere un modo portatile veloce O (1) zero risorse per controllare se una directory è vuota.

aggiornare

La versione di cui sopra non tiene conto di file nascosti / dirs, nel caso in cui è richiesto un po 'di test, come i is_emptyda sh di Rich (POSIX shell) trucchi :

is_empty () (
cd "$1"
set -- .[!.]* ; test -f "$1" && return 1
set -- ..?* ; test -f "$1" && return 1
set -- * ; test -f "$1" && return 1
return 0 )

Ma, invece, sto pensando a qualcosa del genere:

dir_is_empty() {
    [ "$(find "$1" -name "?*" | dd bs=$((${#1}+3)) count=1 2>/dev/null)" = "$1" ]
}

Qualche preoccupazione per le differenze tra le barre finali rispetto all'argomento e l'output find quando la directory è vuota e le nuove righe finali (ma questo dovrebbe essere facile da gestire), purtroppo nel mio busybox shshow quello che è probabilmente un bug sulla find -> ddpipe con l'output troncato casualmente ( se ho usato catl'output è sempre lo stesso, sembra essere ddcon l'argomento count).


Amo la soluzione portatile. Sono venuto a dare la stessa risposta. L'avevo appena scritto diversamente (restituire 2 se non una directory). Inoltre, queste soluzioni portatili hanno il vantaggio di non chiamare alcun programma esterno, il che potrebbe essere considerato un vantaggio per i sistemi vincolati o incorporati. Sono solo preoccupato che l'uso di "()" possa creare un nuovo sottoprocesso (o almeno costringere a copiare l'ambiente e le cose e poi tornare indietro). Dai un'occhiata a questo: is_empty () {_d = "$ {1: -.}"; [! -d "$ {_ d}"] && return 2; set - "$ {_ d}" / * "$ {_ d}" /.[!.” "$ {_ d}" /..?*; ["$ { }" = "$ {_ d} / $ {_ d} /. [!.] * $ {_ d} /..?*"]; };
Diego Augusto Molina

@DiegoAugustoMolina Recentemente in un progetto ho dovuto rifare questo test, se una directory era vuota, all'inizio usavo python, poi siccome praticamente ho installato python proprio per quello, ho implementato il test in c, l'implementazione è di estrema banalità, mi chiedo perché non sia mai stato aggiunto come test o come comando autonomo
Alex

1
Anch'io ho recentemente avuto bisogno di una soluzione a questo problema per un sistema (davvero) vincolato. Ho persino ottimizzato un po 'il codice precedente per non utilizzare alcuna variabile aggiuntiva. One-liner hacker e brutto ma fantastico. Servitevi:is_empty(){ [ ! -d "${1}" ] && return 2;set -- "${1}" "${1}"/* "${1}"/.[!.]* "${1}"/..?*;[ "${*}" = "${1} ${1}/* ${1}/.[!.]* ${1}/..?*" ]; };
Diego Augusto Molina

2

ZSH

So che la domanda era contrassegnata per bash; ma, solo per riferimento, per gli utenti zsh :

Test per directory non vuota

Per verificare se foonon è vuoto:

$ for i in foo(NF) ; do ... ; done

dove, se foonon è vuoto, forverrà eseguito il codice nel blocco.

Prova per directory vuota

Per verificare se fooè vuoto:

$ for i in foo(N/^F) ; do ... ; done

dove, se fooè vuoto, forverrà eseguito il codice nel blocco.

Appunti

Non abbiamo bisogno di citare la directory foosopra, ma possiamo farlo se abbiamo bisogno di:

$ for i in 'some directory!'(NF) ; do ... ; done

Possiamo anche testare più di un oggetto, anche se non è una directory:

$ mkdir X     # empty directory
$ touch f     # regular file
$ for i in X(N/^F) f(N/^F) ; do echo $i ; done  # echo empty directories
X

Tutto ciò che non è una directory verrà semplicemente ignorato.

extra

Dato che stiamo usando globbing, possiamo usare qualsiasi glob (o espansione di parentesi graffe):

$ mkdir X X1 X2 Y Y1 Y2 Z
$ touch Xf                    # create regular file
$ touch X1/f                  # directory X1 is not empty
$ touch Y1/.f                 # directory Y1 is not empty
$ ls -F                       # list all objects
X/ X1/ X2/ Xf Y/ Y1/ Y2/ Z/
$ for i in {X,Y}*(N/^F); do printf "$i "; done; echo  # print empty directories
X X2 Y Y2

Possiamo anche esaminare gli oggetti che sono inseriti in un array. Con le directory come sopra, ad esempio:

$ ls -F                       # list all objects
X/ X1/ X2/ Xf Y/ Y1/ Y2/ Z/
$ arr=(*)                     # place objects into array "arr"
$ for i in ${^arr}(N/^F); do printf "$i "; done; echo
X X2 Y Y2 Z

Pertanto, possiamo testare oggetti che potrebbero essere già impostati in un parametro di matrice.

Notare che il codice nel forblocco viene, ovviamente, eseguito a turno su ogni directory. Se ciò non è desiderabile, puoi semplicemente popolare un parametro di matrice e quindi operare su quel parametro:

$ for i in *(NF) ; do full_directories+=($i) ; done
$ do_something $full_directories

Spiegazione

Per gli utenti zsh c'è il (F)qualificatore glob (vedi man zshexpn), che corrisponde alle directory "piene" (non vuote):

$ mkdir X Y
$ touch Y/.f        # Y is now not empty
$ touch f           # create a regular file
$ ls -dF *          # list everything in the current directory
f X/ Y/
$ ls -dF *(F)       # will list only "full" directories
Y/

Il qualificatore (F)elenca gli oggetti che corrispondono: è una directory E non è vuota. Quindi, (^F)corrisponde a: non una directory O è vuota. Quindi, (^F)da solo , elencerebbe anche file regolari, per esempio. Quindi, come spiegato nella zshexppagina man, abbiamo anche bisogno del (/)qualificatore glob, che elenca solo le directory:

$ mkdir X Y Z
$ touch X/f Y/.f    # directories X and Y now not empty
$ for i in *(/^F) ; do echo $i ; done
Z

Quindi, per verificare se una data directory è vuota, puoi quindi eseguire:

$ mkdir X
$ for i in X(/^F) ; do echo $i ; done ; echo "finished"
X
finished

e solo per essere sicuri che una directory non vuota non venga catturata:

$ mkdir Y
$ touch Y/.f
$ for i in Y(/^F) ; do echo $i ; done ; echo "finished"
zsh: no matches found: Y(/^F)
finished

Oops! Poiché Ynon è vuoto, zsh non trova corrispondenze per (/^F)("directory vuote") e quindi sputa un messaggio di errore dicendo che non sono state trovate corrispondenze per glob. Dobbiamo quindi sopprimere questi possibili messaggi di errore con il (N)qualificatore glob:

$ mkdir Y
$ touch Y/.f
$ for i in Y(N/^F) ; do echo $i ; done ; echo "finished"
finished

Quindi, per le directory vuote abbiamo bisogno del qualificatore (N/^F), che puoi leggere come: "non avvisarmi di errori, directory che non sono piene".

Allo stesso modo, per directory non vuote abbiamo bisogno del qualificatore (NF), che possiamo anche leggere come: "non avvisarmi di errori, directory piene".


1

Sono sorpreso che la guida Wooledge sulle directory vuote non sia stata menzionata. Questa guida, e in realtà tutta Wooledge, è una lettura obbligata per domande sul tipo di shell.

Da notare da quella pagina:

Non tentare mai di analizzare l'output di ls. Anche le soluzioni ls -A possono non funzionare (ad esempio su HP-UX, se sei root, ls -A fa l'esatto opposto di quello che fa se non sei root - e no, non posso inventare qualcosa di così incredibile stupido).

In effetti, si potrebbe desiderare di evitare del tutto la domanda diretta. Di solito le persone vogliono sapere se una directory è vuota perché vogliono fare qualcosa che coinvolga i file in essa contenuti, ecc. Guarda alla domanda più ampia. Ad esempio, uno di questi esempi basati sulla ricerca potrebbe essere una soluzione appropriata:

   # Bourne
   find "$somedir" -type f -exec echo Found unexpected file {} \;
   find "$somedir" -maxdepth 0 -empty -exec echo {} is empty. \;  # GNU/BSD
   find "$somedir" -type d -empty -exec cp /my/configfile {} \;   # GNU/BSD

Più comunemente, tutto ciò che serve davvero è qualcosa del genere:

   # Bourne
   for f in ./*.mpg; do
        test -f "$f" || continue
        mympgviewer "$f"
    done

In altre parole, la persona che ha posto la domanda potrebbe aver pensato che fosse necessario un esplicito test di directory vuota per evitare un messaggio di errore come mympgviewer: ./*.mpg: Nessun file o directory di questo tipo quando in realtà non è richiesto tale test.


1

Piccola variazione della risposta di Bruno :

files=$(ls -1 /some/dir| wc -l)
if [ $files -gt 0 ] 
then
    echo "Contains files"
else
    echo "Empty"
fi

Per me funziona


1

Prendendo un suggerimento (o più) dalla risposta di olibre, mi piace una funzione Bash:

function isEmptyDir {
  [ -d $1 -a -n "$( find $1 -prune -empty 2>/dev/null )" ]
}

Perché mentre crea una subshell, è il più vicino a una soluzione O (1) come posso immaginare e dargli un nome lo rende leggibile. Allora posso scrivere

if isEmptyDir somedir
then
  echo somedir is an empty directory
else
  echo somedir does not exist, is not a dir, is unreadable, or is  not empty
fi

Per quanto riguarda O (1) ci sono casi anomali: se una directory di grandi dimensioni ha cancellato tutte o tutte tranne l'ultima voce, "find" potrebbe dover leggere l'intera cosa per determinare se è vuota. Credo che le prestazioni previste siano O (1) ma il caso peggiore è lineare nella dimensione della directory. Non l'ho misurato.


0

Finora non ho visto una risposta che utilizza grep che penso darebbe una risposta più semplice (con non troppi simboli strani!). Ecco come controllare se esistono file nella directory utilizzando la shell bourne:

questo restituisce il numero di file in una directory:

ls -l <directory> | egrep -c "^-"

puoi inserire il percorso della directory in cui è scritta la directory. La prima metà della barra verticale assicura che il primo carattere dell'output sia "-" per ogni file. egrep quindi conta il numero di righe che iniziano con quel simbolo utilizzando espressioni regolari. ora tutto ciò che devi fare è memorizzare il numero che ottieni e confrontarlo usando virgolette come:

 #!/bin/sh 
 fileNum=`ls -l <directory> | egrep -c "^-"`  
 if [ $fileNum == x ] 
 then  
 #do what you want to do
 fi

x è una variabile di tua scelta.


0

Mescolando le cose di potatura e le ultime risposte, devo

find "$some_dir" -prune -empty -type d | read && echo empty || echo "not empty"

che funziona anche per percorsi con spazi



0

Vorrei find:

if [ -z "$(find $dir -maxdepth 1 -type f)" ]; then
    echo "$dir has NO files"
else
    echo "$dir has files"

Questo controlla l'output di cercare solo i file nella directory, senza passare attraverso le sottodirectory. Quindi controlla l'output utilizzando l' -zopzione presa da man test:

   -z STRING
          the length of STRING is zero

Guarda alcuni risultati:

$ mkdir aaa
$ dir="aaa"

Directory vuota:

$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
empty

Solo dirs in esso:

$ mkdir aaa/bbb
$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
empty

Un file nella directory:

$ touch aaa/myfile
$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
$ rm aaa/myfile 

Un file in una sottodirectory:

$ touch aaa/bbb/another_file
$ [ -z "$(find aaa/ -maxdepth 1 -type f)" ] && echo "empty"
empty

0

Con qualche soluzione alternativa potrei trovare un modo semplice per scoprire se ci sono file in una directory. Questo può estendersi con più comandi grep per controllare specificamente i file .xml o .txt ecc. Es:ls /some/dir | grep xml | wc -l | grep -w "0"

#!/bin/bash
if ([ $(ls /some/dir | wc -l  | grep -w "0") ])
    then
        echo 'No files'
    else
        echo 'Found files'
fi

-1
if ls /some/dir/* >/dev/null 2>&1 ; then echo "huzzah"; fi;

Mi piace perché non ci sono virgolette o parentesi che compongono il comando.
Dave Webb

Attento a non usarlo se lo imposti nullglob, perché il lscomando avrà successo.
Steve Kehlet

Non funzionerà in tutti gli ambienti nel caso in cui la directory abbia file punto.
Diego Augusto Molina

-1

per testare una directory di destinazione specifica

if [ -d $target_dir ]; then
    ls_contents=$(ls -1 $target_dir | xargs); 
    if [ ! -z "$ls_contents" -a "$ls_contents" != "" ]; then
        echo "is not empty";
    else
        echo "is empty";
    fi;
else
    echo "directory does not exist";
fi;

-1

Prova con il comando trova. Specificare la directory hardcoded o come argomento. Quindi avvia la ricerca per cercare tutti i file all'interno della directory. Controlla se return of find è nullo. Eco i dati di trova

#!/bin/bash

_DIR="/home/user/test/"
#_DIR=$1
_FIND=$(find $_DIR -type f )
if [ -n "$_FIND" ]
then
   echo -e "$_DIR contains files or subdirs with files \n\n "
   echo "$_FIND"
else
echo "empty (or does not exist)"
fi

Se la directory ha directory vuote o file non regolari (socket, dispositivi char, collegamenti simbolici, ecc.) All'interno, questo non funzionerà. La directory verrebbe segnalata come vuota.
Diego Augusto Molina

@DiegoAugustoMolina se ho capito bene la domanda era che stiamo cercando di verificare se i file esistono (come file in letterale) questo è il motivo per cui è stato utilizzato l'argomento -f. ma i tuoi commenti sono ancora veri.
igiannak

-2

Non mi piacciono le ls - Asoluzioni pubblicate. Molto probabilmente si desidera verificare se la directory è vuota perché non si desidera eliminarla. Il seguente lo fa. Se tuttavia desideri solo registrare un file vuoto, sicuramente eliminarlo e ricrearlo è più veloce dell'elenco di file forse infiniti?

Questo dovrebbe funzionare ...

if !  rmdir ${target}
then
    echo "not empty"
else
    echo "empty"
    mkdir ${target}
fi

4
Questo non funziona se l'utente non ha il permesso di scrittura per ${target}/...
Jens

Solo una cattiva idea per rendere distruttivo un test. Tra le altre cose, introduce le condizioni di gara.
4dummies

-2

Funziona bene per me questo (quando esiste dir):

some_dir="/some/dir with whitespace & other characters/"
if find "`echo "$some_dir"`" -maxdepth 0 -empty | read v; then echo "Empty dir"; fi

Con controllo completo:

if [ -d "$some_dir" ]; then
  if find "`echo "$some_dir"`" -maxdepth 0 -empty | read v; then echo "Empty dir"; else "Dir is NOT empty" fi
fi
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.