Come posso verificare se esiste una directory in uno script della shell Bash?


3725

Quale comando può essere utilizzato per verificare se esiste una directory o meno all'interno di uno script della shell Bash?

Risposte:


5151

Per verificare se esiste una directory in uno script di shell, è possibile utilizzare quanto segue:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

O per verificare se non esiste una directory:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

Tuttavia, come sottolinea Jon Ericson , i comandi successivi potrebbero non funzionare come previsto se non si tiene conto del fatto che anche un collegamento simbolico a una directory passerà questo controllo. Es. Eseguendo questo:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

Produrrà il messaggio di errore:

rmdir: failed to remove `symlink': Not a directory

Quindi i collegamenti simbolici potrebbero dover essere trattati in modo diverso, se i comandi successivi prevedono directory:

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi

Prendi nota in particolare delle doppie virgolette utilizzate per racchiudere le variabili. La ragione di ciò è spiegata da 8jean in un'altra risposta .

Se le variabili contengono spazi o altri caratteri insoliti, probabilmente lo script non funzionerà.


29
Se vuoi giocare al sicuro con gli strumenti GNU, l'uso di --è altamente raccomandato (marker di fine opzioni). Altrimenti, se la tua variabile contiene qualcosa che sembra un'opzione, lo script fallirà proprio come con gli spazi.
Marc Mutz - mmutz,

2
Per le versioni moderne di bash, ksh, ecc. [...] è un builtin
fpmurphy

79
Una cosa da tenere a mente: [ ! -d "$DIRECTORY" ]sarà vero o se $DIRECTORYnon esiste, o se lo fa esistere, ma non è una directory. Considera qualcosa di simile if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi; questo fallirà se "$DIRECTORY"è un file. (Ovviamente dovresti controllare se è mkdirriuscito comunque; ci sono una serie di ragioni per cui può fallire.)
Keith Thompson,

5
Vale la pena ricordare che non appena il controllo è stato eseguito, la situazione può essere già cambiata a causa di altri processi. In molti casi è meglio creare o utilizzare la directory e reagire in caso di errore.
Alfe,

12
Invece di testare sia per la directory ( -d) che per il symlink ( -L), è più semplice aggiungere una barra alla variabile, come if [ -d "${THING:+$THING/}" ]. A una directory non dispiacerà la barra aggiuntiva. Un file verrà valutato come falso. Vuoto rimarrà vuoto, quindi falso. E un collegamento simbolico verrà risolto alla sua destinazione. Certo, dipende dal tuo obiettivo. Se vuoi andare lì, va bene. Se vuoi eliminarlo , allora il codice in questa risposta è migliore.
Ghoti,

531

Ricorda di includere sempre le variabili tra virgolette quando fai riferimento a esse in uno script Bash. I bambini di questi tempi crescono con l'idea di poter avere spazi e molti altri personaggi divertenti nei loro nomi di directory. (Spazi! Ai miei tempi, non avevamo spazi fantasiosi!;))

Un giorno, uno di quei bambini eseguirà la tua sceneggiatura con $DIRECTORYset "My M0viez"e la tua sceneggiatura esploderà. Non lo vuoi. Quindi usa questo.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

9
Un altro motivo per utilizzare le virgolette doppie è nel caso in cui $ DIRECTORY non sia impostato per qualche motivo.
Jon Ericson,

2
"avvolgi sempre le variabili tra virgolette doppie ... in uno script bash." Per bash, non tecnicamente necessario quando si utilizza [[...]]; vedi tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS (nota: nessuna divisione di parole): "Nessuna espansione di nome di file o divisione di parole avviene tra [[e]], ma c'è espansione dei parametri e sostituzione dei comandi."
michael,

2
Le directory su Unix / Linux non dovrebbero avere spazi bianchi, e successivamente gli script non dovrebbero essere adattati ad esso. È abbastanza grave che Windows lo supporti, con tutte le conseguenze per gli script di Windows, ma per amore di qualunque cosa, non è necessario introdurre requisiti non necessari.
tvCa

18
@tvCa Trovo che gli utenti preferiscano generalmente avere maggiore flessibilità nei loro nomi di directory piuttosto che essere costretti a rendere le cose più facili per gli sviluppatori. (In effetti, quando ho a che fare con nomi di file lunghi, trovo che quelli senza spazi siano una sofferenza in quanto uccide il ritorno a capo delle parole anche se in passato ho sofferto di non tenere conto dei percorsi con spazi negli script e nei programmi.)
JAB

2
Ha. Gli spazi sono solo personaggi che di solito non hanno glifi. Ad ogni modo, puoi sfuggirli con una barra rovesciata.
Uchuugaka,

228

Nota che il test -d può produrre alcuni risultati sorprendenti:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

File in: "Quando una directory non è una directory?" La risposta: "Quando si tratta di un collegamento simbolico a una directory". Un test leggermente più approfondito:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

Puoi trovare maggiori informazioni nel manuale di Bash sulle espressioni condizionali di Bash e sul [comando incorporato e sul comando [[composto .


12
oppure, supponendo che sia necessario lavorare solo su directory (e i collegamenti possono essere ignorati) => if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi... oppure, per un comando che funziona su entrambi i collegamenti e le directory:rm -r tmpdir
michael,

218

Trovo che la versione a doppia parentesitest renda la scrittura dei test logici più naturale:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

perché if [[ -d "$TARFILE" ]]sto ottenendo [[: non trovato
TheVillageIdiot il

15
@TheVillageIdiot e @Hedgehog, stai usando la shell bash? La doppia parentesi non è universalmente supportata. Ecco una risposta così su questo punto: stackoverflow.com/questions/669452/...
yukondude

6
E in Busybox ash [[ ]]è supportato con le opzioni di compilazione predefinite , ma in realtà non offre funzionalità diverse a [ ]. Se la portabilità è un problema, attenersi [ ]e utilizzare le soluzioni alternative necessarie.
dubiousjim

6
... se si usano i costrutti bash in uno script di shell, la prima riga dello script dovrebbe essere: #! / bin / bash (e non #! / bin / sh, ksh, ecc.)
michael

Quando si usano parentesi quadre doppie in bash, non è necessario citare le variabili.
Hubert Grzeskowiak l'

157

Forma più corta:

[ -d "$DIR" ] && echo "Yes"

6
Funziona così if $dir is a dir, then echo "yes":? Un po 'di spiegazione sarebbe d'aiuto :)
Martijn,

5
cmd && otherè una scorciatoia comune per if cmd; then other; fi: funziona con la maggior parte dei linguaggi di programmazione che supportano la logica booleana ed è nota come valutazione del corto circuito .
Tripleee

1
Il comportamento non è lo stesso sotto set -e(che è una best practice per la programmazione della shell ).
dolmen,

1
@dolmen [ -d "$DIR" ]è spuntato (seguito da && echo Yes), quindi credo set -eche non faccia alcuna differenza al comportamento dello script (cioè se il test fallisce, lo script continua normalmente).
tzot

132

Per verificare l'esistenza di una directory è possibile utilizzare una ifstruttura semplice come questa:

if [ -d directory/path to a directory ] ; then
# Things to do

else #if needed #also: elif [new condition]
# Things to do
fi

Puoi anche farlo in negativo:

if [ ! -d directory/path to a directory ] ; then
# Things to do when not an existing directory

Nota : fai attenzione. Lasciare spazi vuoti su entrambi i lati delle parentesi graffe di apertura e chiusura.

Con la stessa sintassi puoi usare:

-e: any kind of archive

-f: file

-h: symbolic link

-r: readable file

-w: writable file

-x: executable file

-s: file size greater than zero

In che modo è migliore della risposta accettata dal 2008, oltre a passare fuori tema con gli switch di file?
Dan Dascalescu il

meglio, a causa di [! -d directory / percorso di una directory]
user1855805

108
  1. Un semplice script per verificare se è presente una directory o un file:

    if [ -d /home/ram/dir ]   # For file "if [-f /home/rama/file]"
    then
        echo "dir present"
    else
        echo "dir not present"
    fi
  2. Un semplice script per verificare se la directory è presente o meno:

    mkdir tempdir   # If you want to check file use touch instead of mkdir
    ret=$?
    if [ "$ret" == "0" ]
    then
        echo "dir present"
    else
        echo "dir not present"
    fi

    Gli script sopra verificheranno se la directory è presente o meno

    $? se l'ultimo comando ha esito positivo, restituisce "0", altrimenti un valore diverso da zero. Supponiamo che tempdirsia già presente. Quindi mkdir tempdirverrà visualizzato un errore come di seguito:

    mkdir: impossibile creare la directory 'tempdir': il file esiste


4
Il secondo creerebbe la directory, se all'inizio non esistesse. Quindi non è idempotente.
Shihe Zhang

👆👆👆. Il secondo sembra pericoloso. Dal momento che crea la directory, non è nemmeno più vero che la directory non è presente.
Chris

92

Puoi usare test -d(vedi man test).

-d file Vero se il file esiste ed è una directory.

Per esempio:

test -d "/etc" && echo Exists || echo Does not exist

Nota: il testcomando è uguale all'espressione condizionale [(vedi:) man [, quindi è portatile su tutti gli script di shell.

[- Questo è sinonimo di testbuiltin, ma l'ultimo argomento deve essere letterale ]per corrispondere all'apertura [.

Per possibili opzioni o ulteriore aiuto, controllare:

  • help [
  • help test
  • man test o man [

55

O per qualcosa di completamente inutile:

[ -d . ] || echo "No"

6
Non stampa mai "No". La directory corrente esiste sempre, a meno che non venga eliminata da un altro thread o in altri modi.
Jahid,

Esempio perfetto :) dato che quanto "uniche" sono alcune risposte rispetto alla risposta accettata
Sergey Sargsyan

4
Perché è stato votato così tante volte? Non risponde alla domanda.
codeforester

PERCHÉ È LA MIGLIORE RISPOSTA EVA
Karl Morrison,

52

Ecco un linguaggio molto pragmatico:

(cd $dir) || return # Is this a directory,
                    # and do we have access?

In genere lo avvolgo in una funzione:

can_use_as_dir() {
    (cd ${1:?pathname expected}) || return
}

O:

assert_dir_access() {
    (cd ${1:?pathname expected}) || exit
}

La cosa bella di questo approccio è che non devo pensare a un buon messaggio di errore.

cdmi darà già un messaggio standard di una riga per errore standard . Fornirà anche più informazioni di quelle che sarò in grado di fornire. Eseguendo l' cdinterno di una subshell ( ... ), il comando non influisce sulla directory corrente del chiamante. Se la directory esiste, questa subshell e la funzione sono solo no-op.

Avanti è l'argomento che si passa a cd: ${1:?pathname expected}. Questa è una forma più elaborata di sostituzione dei parametri che viene spiegata più dettagliatamente di seguito.

Tl; dr: se la stringa passata in questa funzione è vuota, usciamo di nuovo dalla subshell ( ... )e torniamo dalla funzione con il messaggio di errore dato.


Citando dalla ksh93pagina man:

${parameter:?word}

Se parameter è impostato e non è null, sostituisce il suo valore; in caso contrario, stampare worded uscire dalla shell (se non interattivo). Se wordviene omesso, viene stampato un messaggio standard.

e

Se i due punti :vengono omessi dalle espressioni precedenti, la shell controlla solo se il parametro è impostato o meno.

La frase qui è peculiare alla documentazione della shell, come wordpuò riferirsi a qualsiasi stringa ragionevole, incluso lo spazio bianco.

In questo caso particolare, so che il messaggio di errore standard 1: parameter not setnon è sufficiente, quindi ingrandisco il tipo di valore che ci aspettiamo qui: ilpathname di una directory.

Una nota filosofica:

La shell non è un linguaggio orientato agli oggetti, quindi il messaggio dice di pathnameno directory. A questo livello, preferirei che fosse semplice: gli argomenti di una funzione sono solo stringhe.


Questo non si limita a controllare l'esistenza: questo controllo dell'accessibilità a livello dell'utente. Quindi la domanda rappresenta solo l' esistenza . Quindi la risposta giusta è test -dcome ha spiegato @Grundlefleck.
F. Hauri,

7
@ F.Hauri - Non ha chiesto altro, è vero. Tuttavia, ho scoperto che in genere ho bisogno di sapere di più.
Henk Langeveld,

E non mi è mai venuto in mente che nessun test può essere conclusivo, a meno che non venga eseguito come root. test -d /unreadable/existsfallirà, anche se l'argomento esiste.
Henk Langeveld,

36
if [ -d "$Directory" -a -w "$Directory" ]
then
    #Statements
fi

Il codice sopra controlla se la directory esiste e se è scrivibile.


1
-a è identico in effetti a -e. È stato "deprecato" e il suo uso è scoraggiato.
Cugina Cocaina,

27
DIRECTORY=/tmp

if [ -d "$DIRECTORY" ]; then
    echo "Exists"
fi

Prova online


ricorda spacedopo [-> [`` -d . ho ricevuto un errore a causa della mancanza di spazio
Raj,

4
DI NUOVO , questa risposta è già stata data nel 2008, con spiegazioni più utili. L'unica novità è il parco giochi online.
Dan Dascalescu il

24

Digita questo codice al prompt di Bash:

if [ -d "$DIRECTORY" ]; then
    # If true this block of code will execute
fi

DI NUOVO , questa risposta è già stata data nel 2008. Qual è il punto di ripeterla ?!
Dan Dascalescu il

21

Altre funzionalità utilizzando find

  • Verifica l'esistenza della cartella all'interno delle sottodirectory:

    found=`find -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where "myDirectory" is.
        # It may contain several lines if there are several folders named "myDirectory".
    fi
  • Verifica l'esistenza di una o più cartelle in base a un modello all'interno della directory corrente:

    found=`find -maxdepth 1 -type d -name "my*"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where folders "my*" have been found.
    fi
  • Entrambe le combinazioni. Nel seguente esempio, verifica l'esistenza della cartella nella directory corrente:

    found=`find -maxdepth 1 -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' is not empty => "myDirectory"` exists.
    fi

Ciao Niel La tua idea può essere utile per verificare l'esistenza di directory a seconda di uno schema simile: find -maxdepth 1 -type d -name 'pattern'. Ti dispiace se aggiungo nella tua risposta questo trucco? Saluti;)
olibre

20

In realtà, dovresti usare diversi strumenti per ottenere un approccio antiproiettile:

DIR_PATH=`readlink -f "${the_stuff_you_test}"` # Get rid of symlinks and get abs path
if [[ -d "${DIR_PATH}" ]] ; Then # Now you're testing
    echo "It's a dir";
fi

Non è necessario preoccuparsi di spazi e caratteri speciali finché si utilizza "${}".

Nota che [[]]non è portatile come [], ma dal momento che la maggior parte delle persone lavora con le versioni moderne di Bash (dal momento che la maggior parte delle persone non lavora nemmeno con la riga di comando :-p), il vantaggio è maggiore del problema.


17

Hai mai considerato di fare qualsiasi cosa tu voglia fare ifpiuttosto che guardare prima di saltare?

Vale a dire, se si desidera verificare l'esistenza di una directory prima di accedervi, provare a fare questo:

if pushd /path/you/want/to/enter; then
    # Commands you want to run in this directory
    popd
fi

Se il percorso che dai a pushdesiste esiste, lo inserirai e uscirà con 0, il che significa chethen uscirà verrà eseguita parte dell'istruzione. Se non esiste, non accadrà nulla (a parte qualche output che dice che la directory non esiste, il che è probabilmente un utile effetto collaterale comunque per il debug).

Sembra meglio di questo, che richiede di ripetersi:

if [ -d /path/you/want/to/enter ]; then
    pushd /path/you/want/to/enter
    # Commands you want to run in this directory
    popd
fi

La stessa cosa funziona con cd, mv, rm, ecc ... se li cerca su file che non esistono, loro escono con un errore e stampare un messaggio che non esiste, e il tuo thenblocco verranno ignorati. Se li provi su file esistenti, il comando verrà eseguito e uscirà con uno stato di 0, consentendo l' thenesecuzione del blocco.


2
pushd è per me il modo più elegante di farlo. Stavo per pubblicarlo come risposta :)
melMass il

16
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"

NB: citare le variabili è una buona pratica.

Spiegazione:

  • -d: controlla se è una directory
  • -L: controlla se si tratta di un link simbolico

Una spiegazione sarebbe in ordine ( modificando la tua risposta , non qui nei commenti).
Peter Mortensen,

15

Per controllare più di una directory utilizzare questo codice:

if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
    # Things to do
fi

come puoi verificare che non esista?
perrohunter

15

Controlla se la directory esiste, altrimenti creane una:

[ -d "$DIRECTORY" ] || mkdir $DIRECTORY

16
Puoi usare mkdir -p "$DIRECTORY"per lo stesso effetto.
Logan Pickup,


11

Questa risposta è racchiusa in uno script di shell

Esempi

$ is_dir ~                           
YES

$ is_dir /tmp                        
YES

$ is_dir ~/bin                       
YES

$ mkdir '/tmp/test me'

$ is_dir '/tmp/test me'
YES

$ is_dir /asdf/asdf                  
NO

# Example of calling it in another script
DIR=~/mydata
if [ $(is_dir $DIR) == "NO" ]
then
  echo "Folder doesnt exist: $DIR";
  exit;
fi

is_dir

function show_help()
{
  IT=$(CAT <<EOF

  usage: DIR
  output: YES or NO, depending on whether or not the directory exists.

  )
  echo "$IT"
  exit
}

if [ "$1" == "help" ]
then
  show_help
fi
if [ -z "$1" ]
then
  show_help
fi

DIR=$1
if [ -d $DIR ]; then 
   echo "YES";
   exit;
fi
echo "NO";

10

L'uso del -econtrollo controllerà la presenza di file e questo include le directory.

if [ -e ${FILE_PATH_AND_NAME} ]
then
    echo "The file or directory exists."
fi

1
E non risponde correttamente alla domanda del PO: è una directory?
Mark Stewart,

8

Secondo il commento di Jonathan :

Se vuoi creare la directory e non esiste ancora, la tecnica più semplice è quella di mkdir -pcreare la directory - e tutte le directory mancanti nel percorso - e non fallire se la directory esiste già, quindi puoi fare tutto subito con:

mkdir -p /some/directory/you/want/to/exist || exit 1

7
if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists
fi

Questo non è del tutto vero ...

Se vuoi andare in quella directory, devi anche avere i diritti di esecuzione sulla directory. Forse devi avere anche i diritti di scrittura.

Perciò:

if [ -d "$DIRECTORY" ] && [ -x "$DIRECTORY" ] ; then
    # ... to go to that directory (even if DIRECTORY is a link)
    cd $DIRECTORY
    pwd
fi

if [ -d "$DIRECTORY" ] && [ -w "$DIRECTORY" ] ; then
    # ... to go to that directory and write something there (even if DIRECTORY is a link)
    cd $DIRECTORY
    touch foobar
fi

7

Usa il fileprogramma. Considerando che tutte le directory sono anche file in Linux, è sufficiente emettere il seguente comando:

file $directory_name

Verifica di un file inesistente: file blah

Produzione: cannot open 'blah' (No such file or directory)

Verifica di una directory esistente: file bluh

Produzione: bluh: directory


1
Bella idea, comunque troppo male in entrambi i casi il comando file restituisce sempre 0 codice di uscita. Anche quando non è possibile trovare il file / directory :(.
danger89

6

Il lscomando insieme -lall'opzione (elenco lungo) restituisce informazioni sugli attributi su file e directory.
In particolare il primo carattere ls -ldell'output è di solito a do a -(trattino). Nel caso di dquello elencato è sicuramente una directory.

Il seguente comando in una sola riga ti dirà se la ISDIRvariabile data contiene o meno un percorso in una directory:

[[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] &&
    echo "YES, $ISDIR is a directory." || 
    echo "Sorry, $ISDIR is not a directory"

Uso pratico:

    [claudio@nowhere ~]$ ISDIR="$HOME/Music" 
    [claudio@nowhere ~]$ ls -ld "$ISDIR"
    drwxr-xr-x. 2 claudio claudio 4096 Aug 23 00:02 /home/claudio/Music
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." ||
        echo "Sorry, $ISDIR is not a directory"
    YES, /home/claudio/Music is a directory.

    [claudio@nowhere ~]$ touch "empty file.txt"
    [claudio@nowhere ~]$ ISDIR="$HOME/empty file.txt" 
    [claudio@nowhere ~]$ [[ $(ls -ld "$ISDIR" | cut -c1) == 'd' ]] && 
        echo "YES, $ISDIR is a directory." || 
        echo "Sorry, $ISDIR is not a directoy"
    Sorry, /home/claudio/empty file.txt is not a directory

+1, ma quando ISDIR non esiste affatto viene visualizzato un messaggio di errore e un messaggio di diagnostica.


5

Se si desidera verificare l'esistenza di una directory, indipendentemente dal fatto che sia una directory reale o un collegamento simbolico, utilizzare questo:

ls $DIR
if [ $? != 0 ]; then
        echo "Directory $DIR already exists!"
        exit 1;
fi
echo "Directory $DIR does not exist..."

Spiegazione: Il comando "ls" restituisce un errore "ls: / x: nessun file o directory" se la directory o il collegamento simbolico non esiste e imposta anche il codice di ritorno, che è possibile recuperare tramite "$?", Su non -null (normalmente "1"). Assicurati di controllare il codice di ritorno direttamente dopo aver chiamato "ls".


3
In alternativa puoi usare questa versione più breve:if ! ls $DIR 2>/dev/null; then echo "$DIR does not exist!"; fi
derFunk

5

(1)

[ -d Piyush_Drv1 ] && echo ""Exists"" || echo "Not Exists"

(2)

[ `find . -type d -name Piyush_Drv1 -print | wc -l` -eq 1 ] && echo Exists || echo "Not Exists"

(3)

[[ -d run_dir  && ! -L run_dir ]] && echo Exists || echo "Not Exists"

Se viene riscontrato un problema con uno degli approcci forniti sopra:

Con il lscomando; i casi in cui non esiste una directory: viene visualizzato un messaggio di errore

[[ `ls -ld SAMPLE_DIR| grep ^d | wc -l` -eq 1 ]] && echo exists || not exists

-ksh: not: not found [Nessun file o directory simile]


A cosa si riferisce "sopra"? Le tre righe di comando in questa risposta o nelle risposte precedenti? (Rispondere modificando la risposta , non qui nei commenti. Grazie in anticipo.).
Peter Mortensen,

4

Ci sono ottime soluzioni là fuori, ma alla fine ogni script fallirà se non sei nella directory giusta. Quindi codice come questo:

if [ -d "$LINK_OR_DIR" ]; then
if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here
    rm "$LINK_OR_DIR"
else
    # It's a directory!
    # Directory command goes here
    rmdir "$LINK_OR_DIR"
fi
fi

verrà eseguito correttamente solo se al momento dell'esecuzione ci si trova in una directory con una sottodirectory che si verifica per caso.

Comprendo la domanda iniziale in questo modo: verificare se esiste una directory indipendentemente dalla posizione dell'utente nel file system. Quindi usare il comando 'trova' potrebbe fare il trucco:

dir=" "
echo "Input directory name to search for:"
read dir
find $HOME -name $dir -type d

Questa soluzione è valida perché consente l'uso di caratteri jolly, una funzione utile durante la ricerca di file / directory. L'unico problema è che, se la directory cercata non esiste, il comando 'trova' non stamperà nulla sullo standard output (non è una soluzione elegante per i miei gusti) e avrà comunque un'uscita zero. Forse qualcuno potrebbe migliorare su questo.


13
Sarei offeso se un programma passasse in rassegna tutto il mio disco rigido per trovare una directory piuttosto che cercare educatamente nella mia directory di lavoro corrente o usando il percorso assoluto che gli do. Quello che hai suggerito potrebbe essere bello per uno strumento chiamato locatema non bello per nient'altro ...
sarnold
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.