2012-01-19 15 views
5

Come si verifica un test per l'esistenza di file in una directory utilizzando bash?sh: verifica dell'esistenza di file

if ... ; then 
    echo 'Found some!' 
fi 

Per essere chiari, io non voglio verificare l'esistenza di uno specifico file di . Vorrei verificare se una directory specifica contiene qualsiasi file.


sono andato con:

(
    shopt -s dotglob nullglob 
    existing_files=(./*) 
    if [[ ${#existing_files[@]} -gt 0 ]] ; then 
     some_command "${existing_files[@]}" 
    fi 
) 

Utilizzando la matrice evita condizioni di gara da leggere l'elenco dei file due volte.

+0

Che cosa succede se la directory contiene sottodirectory, ma nessun file normali? –

+0

@ Keith Thompson, non succederà. – ikegami

+0

possibile duplicato di [Controllare se una directory contiene file] (http://stackoverflow.com/questions/91368/checking-if-a-directory-contains-files) –

risposta

7

Generalmente uso solo un ls -A economico per vedere se t ecco una risposta.

Pseudo-forse-corretta-sintassi-esempio-ahoy:

if [[ $(ls -A my_directory_path_variable) ]] then.... 

modificare, questo funzionerà:

myDir=(./*) if [ ${#myDir[@]} -gt 1 ]; then echo "there's something down here"; fi

+0

Questa risposta dovrebbe funzionare per te, anche se è un po 'hacker. Prenderò una pugnalata a una soluzione tutto sh/bash. –

+0

Sembra un po 'distorto, ma funziona davvero. Non vedo l'ora di vedere cosa ti viene in mente :) – ikegami

+1

myDir = (./*) se [$ {# myDir [@]} -gt 1]; quindi echo "c'è qualcosa qui sotto"; fi ... ecco qui. collega e usa. –

9

Dalla pagina man:

-f file 
      True if file exists and is a regular file. 

Quindi:

if [ -f someFileName ]; then echo 'Found some!'; fi 

Edit: Vedo che hai già avuto la risposta, ma per completezza, è possibile utilizzare le informazioni in Checking from shell script if a directory contains files - e perdere la opzione dotglob se vuoi che i file nascosti vengano ignorati.

+0

Che verifica l'esistenza di un file specifico. Vorrei testare l'esistenza di qualsiasi file. – ikegami

+0

Ah, ho frainteso. OK, hai bisogno di prendere i file nascosti (cioè .xyz)? –

+0

No, ignorare i file nascosti va bene. – ikegami

3

Prova questo

if [ -f /tmp/foo.txt ] 
then 
    echo the file exists 
fi 

ref: http://tldp.org/LDP/abs/html/fto.html

si consiglia inoltre di controllare questo fuori: http://tldp.org/LDP/abs/html/fto.html

Che ne dite di questo per se directory è vuota o non

$ find "/tmp" -type f -exec echo Found file {} \; 
+0

Che verifica l'esistenza di un file specifico. Vorrei testare l'esistenza di qualsiasi file. – ikegami

1
#!/bin/bash 

if [ -e $1 ]; then 
     echo "File exists" 
else 
     echo "Files does not exist" 
fi 
+0

Che verifica l'esistenza di un file specifico. Vorrei testare l'esistenza di qualsiasi file in una directory specifica. – ikegami

3

È possibile utilizzare ls in un if dichiarazione in tal modo :

if [[ "$(ls -a1 | egrep -v '^\.$|^\.\.$')" = "" ]] ; then echo empty ; fi 

o, grazie alla Ikegami,

if [[ "$(ls -A)" = "" ]] ; then echo empty ; fi 

o, ancora più breve:

if [[ -z "$(ls -A)" ]] ; then echo empty ; fi 

Si tratta in sostanza elencare tutti i file nella directory corrente (compresi quelli nascosti) che non sono né ....

Se la lista è vuota, la directory è vuota.

Se vuoi scontare i file nascosti, è possibile semplificare a:

if [[ "$(ls)" = "" ]] ; then echo empty ; fi 

Una soluzione bash -solo (nessun invocando programmi esterni come ls o egrep) può essere fatto nel modo seguente:

emp=Y; for i in *; do if [[ $i != "*" ]]; then emp=N; break; fi; done; echo $emp 

non è il codice più bella nel mondo, pone semplicemente 012.a Y e quindi, per ogni file reale, lo imposta su N e interrompe il ciclo for per l'efficienza. Se c'erano zero file, rimane come Y.

+0

Se si 's/ls -a/ls -A /', la necessità di 'egrep' scompare. – ikegami

+0

perché usare egrep quando puoi rimanere all'interno di bash? inoltre, non è necessario confrontare il risultato con una stringa vuota. questo è più costoso di quanto dovrebbe essere. –

+0

@tristan, questo è probabilmente il motivo per cui hai accettato piuttosto che me :-) Tuttavia, dovresti tenere a mente che nessuna delle mie soluzioni di cui sopra, non la tua, rimane "all'interno di bash". Invocano tutti 'ls' ed eseguibili esterni. Aggiungerò una soluzione bash-only anche se sarà brutta. – paxdiablo

1

non ho una buona soluzione pura sh/bash, ma è facile da fare in Perl:

#!/usr/bin/perl 

use strict; 
use warnings; 

die "Usage: $0 dir\n" if scalar @ARGV != 1 or not -d $ARGV[0]; 
opendir my $DIR, $ARGV[0] or die "$ARGV[0]: $!\n"; 
my @files = readdir $DIR; 
closedir $DIR; 
if (scalar @files == 2) { # . and .. 
    exit 0; 
} 
else { 
    exit 1; 
} 

Chiamatela qualcosa come emptydir e metterlo da qualche parte nel vostro $PATH, allora:

if emptydir dir ; then 
    echo "dir is empty" 
else 
    echo "dir is not empty" 
fi 

Muore con un messaggio di errore se non gli si forniscono argomenti, due o più argomenti o un argomento che non è una directory; è abbastanza facile cambiare se preferisci un comportamento diverso.

+1

'exit (definito (glob quotemeta ($ ARGV [0] //". ")."/* ")? 0: 1)' – ikegami

+0

oh, giusto, il mio non controlla i file nascosti. – ikegami

0

Per il divertimento:

if (shopt -s nullglob ; perl -e'exit [email protected]' ./*) ; then 
    echo 'Found some!' 
fi 

(Non controllare i file nascosti)

1
# tested on Linux BASH 

directory=$1 

if test $(stat -c %h $directory) -gt 2; 
then 
    echo "not empty" 
else 
    echo "empty" 
fi 
+0

Si potrebbe ottenere il falso negativo sulle directory radice, ma interessante. – ikegami