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

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

Ответы [ 34 ]

11 голосов
/ 15 апреля 2016

Этот ответ в виде сценария оболочки

Примеры

$ 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 голосов
/ 25 июля 2013

Использование проверки -e проверит файлы, включая каталоги.

if [ -e ${FILE_PATH_AND_NAME} ]
then
    echo "The file or directory exists."
fi
8 голосов
/ 13 сентября 2015

Согласно Джонатан комментарий:

Если вы хотите создать каталог, а он еще не существует, тогда самый простой метод - использовать mkdir -p, который создает каталог - и любые отсутствующие каталоги по пути - и не завершается ошибкой, если каталог уже существует, так что вы можете сделать все сразу с помощью:

mkdir -p /some/directory/you/want/to/exist || exit 1
7 голосов
/ 18 марта 2010
if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists
fi

Это не совсем так ... Если вы хотите перейти в этот каталог, вам также необходимо иметь права на выполнение этого каталога. Может быть, вам также нужны права на запись.

Therfore:

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
6 голосов
/ 15 сентября 2011

Команда ls в сочетании с параметром -l (длинный список) возвращает информацию об атрибутах файлов и каталогов.
В частности, первый символ вывода ls -l это обычно d или - (тире). В случае d указанный каталог является каталогом наверняка.

Следующая команда в одной строке покажет вам, содержит ли данная переменная ISDIR путь к каталогу или нет:

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

Практическое использование:

    [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
5 голосов
/ 07 января 2014

Если вы хотите проверить, существует ли каталог, независимо от того, является ли он реальным каталогом или символической ссылкой, используйте это:

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

Объяснение: Команда "ls" выдает ошибку "ls: / x: Нет такого файла или каталога", если каталог или символическая ссылка не существует, а также задает код возврата, который вы можете получить с помощью "$?" , не равным нулю (обычно «1»). Обязательно проверяйте код возврата сразу после вызова "ls".

5 голосов
/ 13 мая 2015

(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"

Если обнаружена проблема с одним из предложенных выше подходов.

С помощью команды ls; случаи, когда каталог не существует - отображается сообщение об ошибке

$ [[ls -ld SAMPLE_DIR| grep ^d | wc -l -eq 1]] && echo существует || не существует -ksh: not: not found [Нет такого файла или каталога]

5 голосов
/ 22 февраля 2013
file="foo" 
if [[ -e "$file" ]]; then echo "File Exists"; fi;
4 голосов
/ 13 августа 2014

Ниже можно найти,

find . -type d -name dirname -prune -print
4 голосов
/ 13 сентября 2017

Git Bash + Dropbox + Windows:

Ни одно из других решений не работало для моей папки Dropbox, что было странно, потому что я могу использовать git push to dropbox символический путь.

#!/bin/bash

dbox="~/Dropbox/"
result=0
prv=$(pwd) && eval "cd $dbox" && result=1 && cd "$prv"
echo $result

read -p "Press Enter To Continue:"

Возможно, вы захотите узнать, как успешно перейти на Dropbox из Bash. Итак, вот сценарий в полном объеме.

https://pastebin.com/QF2Exmpn

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...