Comando per visualizzare un messaggio arbitrario se esiste un determinato file

11

Esiste un comando per visualizzare il messaggio "Sì" se esiste un determinato file? Non è necessario fornire funzionalità se il file non esiste.

    
posta james 14.06.2016 - 18:58
fonte

5 risposte

25

Utilizza questo semplice Bash one-liner:

if [ -e FILENAME ] ; then echo Yes ; fi

Il controllo -e restituisce true se FILENAME esiste, indipendentemente da cosa sia (file, directory, collegamento, dispositivo, ...).

Se vuoi solo controllare i file regolari, usa invece -f , come indicato @Arronical .

    
risposta data Byte Commander 14.06.2016 - 19:05
fonte
10

Puoi usare questo semplice script:

#!/bin/bash

if [[ -f $1 ]]; then
    echo "Yes"
    exit 0
else
    exit 1
fi

Salvalo come file-exists.sh . Quindi, nel Terminale, digita chmod +x file-exists.sh .

Usalo come: ./file-exists.sh FILE dove sostituisci FILE con il file che vuoi controllare, ad esempio:

./file-exists.sh file.txt

Se file.txt esiste, Yes verrà stampato sul terminale e il programma uscirà con lo stato 0 (esito positivo). Se il file non esiste, non verrà stampato nulla e il programma uscirà con lo stato 1 (errore).

Se sei curioso di sapere perché ho incluso il comando exit , leggi su ...

Che cosa succede con il comando exit ?

exit causa la normale chiusura del processo. Ciò significa, in sostanza: blocca la sceneggiatura. Accetta un parametro opzionale (numerico) che sarà lo stato di uscita dello script che lo ha chiamato.

Questo stato di uscita consente agli altri script di utilizzare lo script file-exists ed è il loro modo di conoscere il file esistente o meno.

Un semplice esempio che mette questo da usare è questo script (salvalo come file-exists-cli.sh ):

#!/bin/bash

echo "Enter a filename and I will tell you if it exists or not: "
read FILE
# Run 'file-exists.sh' but discard any output because we don't need it in this example
./file-exists.sh $FILE &>> /dev/null
# #? is a special variable that holds the exit status of the previous command
if [[ $? == 0 ]]; then
    echo "$FILE exists"
else
    echo "$FILE does not exist"
fi

Fai il solito chmod +x file-exists-cli.sh e poi eseguilo: ./file-exists-cli.sh . Vedrai qualcosa di simile a questo:

Il file esiste ( exit 0 ):

➜  ~ ./file-exists-cli.sh 
Enter a filename and I will tell you if it exists or not: 
booleans.py
booleans.py exists

Il file non esiste ( exit 1 ):

➜  ~ ./file-exists-cli.sh
Enter a filename and I will tell you if it exists or not: 
asdf
asdf does not exist
    
risposta data grooveplex 14.06.2016 - 19:09
fonte
9

Nella shell bash sulla riga di comando.

if [[ -f /path/to/file ]]; then echo "Yes"; fi

Questo utilizza l'operatore condizionale bash -f e controlla se il file esiste ed è un file normale. Se vuoi testare qualsiasi file, inclusi directory e link, usa -e .

Questa è un'ottima risorsa per i bash conditionals.

    
risposta data Arronical 14.06.2016 - 19:03
fonte
5

Il comando più breve per fare ciò che vuoi è:

test -e FILENAME && echo Yes

test -e verificherà se il nome fornito esiste nel file system. (Puoi utilizzare test -f per limitare solo i file normali. Consulta man test per ulteriori informazioni.)

Se la condizione data è vera, allora test restituisce uno stato di uscita riuscito (altrimenti restituisce uno stato di errore). Combiniamo i due comandi usando && , che significa "esegui il comando successivo se il comando precedente è terminato con uno stato di successo". Il comando successivo stampa semplicemente Yes sullo standard output; nel caso di una shell interattiva, sul terminale.

Questo evita il materiale testuale aggiuntivo di un'istruzione if , ma dà lo stesso risultato. Usare && (o il suo contrario, || ) per legare i comandi insieme funziona bene quando è coinvolto un solo comando. Se vuoi fare di più che eseguire un singolo comando in risposta allo stato di uscita di un singolo comando, utilizzare la sintassi if diventa rapidamente molto più leggibile.

Come già sottolineato in altre risposte, il costrutto di stile if equivalente sarebbe:

if test -e FILENAME; then echo Yes; fi

o in alternativa:

if test -e FILENAME
then
    echo Yes
fi

Per questi scopi, [ e test sono equivalenti, tranne che [ richiede un% co_de terminante.

    
risposta data Michael Kjörling 15.06.2016 - 15:35
fonte
4

Per risolvere questo tipo di domande ci sono molti modi, ed eccone un altro: usa find comando con -exec flag. Il percorso del file può essere diviso in due parti find /etc che imposta la directory e -name FILENAME che specifica il nome del file (duh!). -maxdepth manterrà find funzionante solo con la directory /etc e non discenderà nelle sottodirectory

adminx@L455D:~$ find /etc -maxdepth 1  -name passwd -exec printf "YES\n" \;
YES
adminx@L455D:~$ find /etc -maxdepth 1  -name passwd1 -exec printf "YES\n" \;
adminx@L455D:~$ 

Un altro modo, tramite stat :

adminx@L455D:~$ stat /etc/passwd1 &>/dev/null && echo YES
adminx@L455D:~$ stat /etc/passwd &>/dev/null && echo YES
YES

E in alternativa tramite python:

>>> import os
>>> if os.stat('/etc/passwd'): 
...    print 'YES'
... 
YES
>>> if os.stat('/etc/passwd1'): 
...    print 'YES'
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: '/etc/passwd1'

O una breve alternativa da riga di comando:

 python -c "from os.path import exists; print 'Yes' if exists('/etc/fstab') else '' "
    
risposta data Sergiy Kolodyazhnyy 14.06.2016 - 21:48
fonte

Leggi altre domande sui tag