Вопрос: Проверьте, существует ли каталог в сценарии оболочки


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


2941


источник


Ответы:


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

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 в другом ответе ,

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


4046



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

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

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

444



Обратите внимание -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 по Условные выражения Баша и [встроенная команда и [[составная команда ,


201



Я нахожу двойной кронштейн версии testделает логические тесты записи более естественными:

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

198



Более короткая форма:

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

124



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

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 

116



if [ -d "$DIRECTORY" ]; then  
    # Here if $DIRECTORY exists  
fi

94



You can use test -d (see man test).

-d file True if file exists and is a directory.

For example:

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

Note: The test command is same as conditional expression [ (see: man [), so it's portable across shell scripts.

[ - This is a synonym for the test builtin, but the last argument must, be a literal ], to match the opening [.

For possible options or further help, check:

  • help [
  • help test
  • man test or man [

72



Or for something completely useless:

[ -d . ] || echo "No"

54