Проверьте, существует ли каталог в сценарии оболочки - PullRequest
3393 голосов
/ 13 сентября 2008

Какую команду можно использовать для проверки, существует ли каталог в сценарии оболочки?

Ответы [ 34 ]

4734 голосов
/ 13 сентября 2008

Чтобы проверить, существует ли каталог в сценарии оболочки, вы можете использовать следующее:

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

Или проверить, не существует ли каталог:

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

Однако, как указывает Джон Эриксон , последующие команды могут работать не так, как задумано, если не учитывать, что символическая ссылка на каталог также пройдет эту проверку. Например. работает это:

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

выдаст сообщение об ошибке:

rmdir: failed to remove `symlink': Not a 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

Обратите особое внимание на двойные кавычки, используемые для переноса переменных, причина этого объясняется 8jean в другом ответе .

Если переменные содержат пробелы или другие необычные символы, это, вероятно, приведет к сбою сценария.

499 голосов
/ 16 сентября 2008

Не забывайте всегда заключать переменные в двойные кавычки при обращении к ним в скрипт bash. В наши дни дети растут с мыслью, что в их именах каталогов могут быть пробелы и множество других забавных персонажей. (Пробелы! В те времена у нас не было причудливых пробелов!;))

Однажды один из этих детей запустит ваш скрипт с $DIRECTORY, установленным на "My M0viez", и ваш скрипт взорвется. Вы этого не хотите. Так что используйте это.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi
218 голосов
/ 13 сентября 2008

Обратите внимание, что тест -d может дать неожиданные результаты:

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

Файл в разделе: «Когда каталог не каталог?» Ответ: «Когда это символическая ссылка на каталог». Немного более тщательный тест:

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

Дополнительную информацию можно найти в руководстве по Bash: Условные выражения Bash и встроенная команда [ и составная команда [[ .

207 голосов
/ 13 сентября 2008

Я считаю, что двойная скобка версия test делает написание логических тестов более естественным:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi
142 голосов
/ 13 сентября 2008

Короче форма:

[ -d "$DIR" ] && echo "Yes"
124 голосов
/ 08 апреля 2015

Чтобы проверить, существует ли каталог, вы можете использовать простую структуру if:

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

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

Вы можете сделать это также отрицательно

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

Примечание : будьте осторожны, оставляйте пустые места по обе стороны от открывающей и закрывающей скобок.

С тем же синтаксисом, который вы можете использовать:

-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 
96 голосов
/ 15 апреля 2014
if [ -d "$DIRECTORY" ]; then  
    # Here if $DIRECTORY exists  
fi
82 голосов
/ 13 сентября 2015

Вы можете использовать test -d (см. man test).

-d file Истина, если файл существует и является каталогом.

Например:

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

Примечание. Команда test аналогична условному выражению [ (см .: man [), поэтому она переносима между сценариями оболочки.

[ - это синоним встроенного test, но последний аргумент должен быть литералом ], чтобы соответствовать открытию [.

Для возможных вариантов или дополнительной помощи, проверьте:

  • help [
  • help test
  • man test или man [
74 голосов
/ 15 мая 2018
  1. Простой скрипт для проверки наличия или отсутствия dir или файла:

    if [ -d /home/ram/dir ]   # for file "if [-f /home/rama/file]" 
    then 
        echo "dir present"
    else
        echo "dir not present"
    fi
    
  2. Простой скрипт для проверки наличия каталога:

    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
    

    Приведенные выше скрипты проверят наличие или отсутствие директории

    $? если последняя команда успешно выполнена, она возвращает «0», иначе ненулевое значение. предположим, что tempdir уже присутствует, тогда mkdir tempdir выдаст ошибку, как показано ниже:

    mkdir: невозможно создать каталог «tempdir»: файл существует

54 голосов
/ 17 августа 2009

Или за что-то совершенно бесполезное:

[ -d . ] || echo "No"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...