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

3726

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

Grundlefleck
источник

Ответы:

5151

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

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

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

Grundlefleck
источник
29
Если вы хотите быть осторожнее с инструментами GNU, --настоятельно рекомендуется использовать их (маркер конца опций). В противном случае, если ваша переменная содержит нечто, похожее на параметр, скрипт завершится с ошибкой, как и с пробелами.
Марк Муц - Ммуц
2
Для современных версий bash, ksh и т. Д. [...] является встроенной
fpmurphy
79
Одна вещь , чтобы иметь в виду: [ ! -d "$DIRECTORY" ]будет верно либо , если $DIRECTORYне существует, или если действительно существует , но не является каталогом. Рассмотрим что-то вроде if [ ! -d "$DIRECTORY" ] ; then mkdir "$DIRECTORY" ; fi; это не удастся, если "$DIRECTORY"это файл. (Конечно, вы должны проверить, mkdirудалось ли это в любом случае; есть ряд причин, по которым он может потерпеть неудачу.)
Кит Томпсон
5
Возможно, стоит упомянуть, что как только проверка была выполнена, ситуация может измениться уже из-за других процессов. Во многих случаях лучше просто создать или использовать каталог и реагировать на ошибки.
Alfe
12
Вместо того, чтобы тестировать и directory ( -d), и symlink ( -L), проще просто добавить косую черту к переменной, например if [ -d "${THING:+$THING/}" ]. Каталог не будет возражать против дополнительной косой черты. Файл оценивается как ложный. Пустой останется пустым, поэтому ложным. И символическая ссылка будет разрешена к месту назначения. Конечно, это зависит от вашей цели. Если вы хотите пойти туда, это нормально. Если вы хотите удалить его , то код в этом ответе лучше.
Ghoti
531

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

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

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi
8jean
источник
9
Еще одна причина использовать двойные кавычки в том случае, если $ DIRECTORY не установлен по какой-либо причине.
Джон Эриксон
2
msgstr "всегда заключать переменные в двойные кавычки ... в скрипте bash." Для bash, технически не требуется при использовании [[...]]; см. tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS (примечание: без разделения слов): «Не происходит расширения имени файла или разделения слова между [[и]], но есть расширение параметра и подстановка команд».
Майкл
2
Каталоги в Unix / Linux не должны иметь пробелов, и впоследствии сценарии не должны быть адаптированы к нему. Достаточно плохо, что Windows поддерживает это, со всеми вытекающими последствиями для сценариев Windows, но, пожалуйста, ради всего, нет необходимости вводить ненужные требования.
tvCa
18
@tvCa Я считаю, что пользователи, как правило, предпочитают, чтобы им было разрешено иметь больше гибкости в именах каталогов, а не вынуждены упростить разработку. (На самом деле, при работе с длинными именами файлов я нахожу боль без пробелов, поскольку это убивает перенос слов, хотя в прошлом я сам страдал от того, что не учел пути с пробелами в скриптах и ​​программах.)
JAB
2
Ха. Пробелы - это просто символы, которые обычно не имеют глифов. В любом случае, вы можете избежать их с помощью обратной косой черты.
Учуугака
228

Обратите внимание, что тест -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, а также по [встроенной команде и [[составной команде .

Джон Эриксон
источник
12
или, если предположить, что необходимо работать только с каталогами (а ссылки можно игнорировать) => if [ -d tmpdir -a ! -L tmpdir ]; then echo "is directory"; rmdir tmpdir; fi... или для одной команды, которая работает как с ссылками, так и с директорами:rm -r tmpdir
michael
218

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

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi
yukondude
источник
ибо if [[ -d "$TARFILE" ]]я получаю [[: не найдено
TheVillageIdiot
15
@TheVillageIdiot и @Hedgehog, вы используете оболочку bash? Двойная скобка не всегда поддерживается. Вот SO ответ на этот вопрос: stackoverflow.com/questions/669452/…
yukondude
6
А в Busybox ash с параметрами компиляции по умолчанию [[ ]]поддерживается, но фактически не предоставляет никакой другой функциональности [ ]. Если переносимость является проблемой, придерживайтесь [ ]и используйте необходимые обходные пути.
dubiousjim
6
... если в скрипте оболочки используются конструкции bash, первая строка скрипта должна выглядеть так: #! / bin / bash (а не #! / bin / sh, ksh и т. д.)
майкл
При использовании двойных квадратных скобок в bash вам не нужно заключать переменные в кавычки.
Юбер Гжесковяк,
157

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

[ -d "$DIR" ] && echo "Yes"
Elmarco
источник
6
Работает ли это так: if $dir is a dir, then echo "yes"? Немного объяснения помогло бы :)
Мартейн
5
cmd && otherэто общее сокращение для if cmd; then other; fi- это работает с большинством языков программирования, которые поддерживают булеву логику, и известно как оценка короткого замыкания .
tripleee
1
Поведение не то же самое в соответствии с set -e(что является лучшей практикой программирования оболочки ).
дольмен
1
@dolmen [ -d "$DIR" ]проверяется (сопровождается && echo Yes), так что я полагаю, set -eчто нет никакой разницы в поведении сценария (т. е. если проверка не пройдена, сценарий продолжается нормально).
Цот
132

Чтобы проверить, существует ли каталог, вы можете использовать простую 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
Хорхе Баррозу
источник
Чем это может быть лучше, чем принятый в 2008 году ответ, кроме того, что он выходит за рамки темы с переключателями файлов?
Дан Даскалеску
лучше из-за [! -d каталог / путь к каталогу]
user1855805
108
  1. Простой скрипт для проверки наличия каталога или файла:

    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': файл существует

yoctotutor.com
источник
4
Второй создаст каталог, если его сначала не было. Тогда это не идемпотент.
Шихе Чжан
👆👆👆. Второй кажется опасным. Так как он создает каталог, это даже не правда, что каталог отсутствует.
Крис
92

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

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

Например:

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

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

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

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

  • help [
  • help test
  • man test или man [
kenorb
источник
55

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

[ -d . ] || echo "No"
STH
источник
6
Он никогда не напечатает «Нет». Текущий каталог всегда существует, если только он не удален другим потоком или другими способами.
Джахид
Прекрасный образец :) учитывая, насколько «уникальны» некоторые ответы по сравнению с принятым ответом
Сергей Саргсян
4
Почему за это проголосовали так много раз? Это не отвечает на вопрос.
codeforester
ПОТОМУ ЧТО ЭТО ЛУЧШИЙ ОТВЕТ ЕВА
Карл Моррисон
52

Вот очень прагматичная идиома:

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

Я обычно оборачиваю это в функцию:

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

Или:

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

Хорошая вещь об этом подходе состоит в том, что мне не нужно думать о хорошем сообщении об ошибке.

cdдаст мне стандартное однострочное сообщение к стандартной ошибке уже. Это также даст больше информации, чем я смогу предоставить. Выполняя cdвнутреннюю часть подоболочки ( ... ), команда не влияет на текущий каталог вызывающей стороны. Если каталог существует, эта подоболочка и функция просто не активны.

Далее идет аргумент , что мы переходим к cd: ${1:?pathname expected}. Это более сложная форма замены параметров, которая более подробно описана ниже.

Tl; dr: если строка, переданная в эту функцию, пуста, мы снова выходим из подоболочки ( ... )и возвращаемся из функции с данным сообщением об ошибке.


Цитата из справочной ksh93страницы:

${parameter:?word}

Если parameter установлено и не равно нулю, подставьте его значение; в противном случае распечатайте wordи выйдите из оболочки (если он не интерактивный). Если wordопущено, то печатается стандартное сообщение.

а также

Если двоеточие :отсутствует в вышеприведенных выражениях, то оболочка только проверяет, задан ли параметр или нет.

Формулировка здесь свойственна документации оболочки, так как word могут относиться к любой разумной строке, включая пробелы.

В этом конкретном случае я знаю, что стандартного сообщения об ошибке 1: parameter not setнедостаточно, поэтому я увеличиваю тип ожидаемого значения -pathname значения - каталога.

Философская заметка:

Оболочка не является объектно-ориентированным языком, поэтому в сообщении говорится pathname, что нет directory. На этом уровне я бы предпочел, чтобы все было просто - аргументы функции - это просто строки.

Хенк Лангевельд
источник
Это больше, чем просто проверка на наличие: эта проверка на доступность на вашем уровне пользователя. ТАК вопрос стоять только за существование . Так что правильный ответ, test -dкак объяснил @Grundlefleck.
Ф. Хаури
7
@ F.Hauri - Он больше ничего не просил, это правда. Однако я обнаружил, что обычно мне нужно знать больше, чем это.
Хенк Лангевельд,
И мне никогда не приходило в голову, что ни один тест не может быть окончательным, если он не выполняется от имени пользователя root. test -d /unreadable/existsпотерпит неудачу, даже если аргумент существует.
Хенк Лангевелд
36
if [ -d "$Directory" -a -w "$Directory" ]
then
    #Statements
fi

Приведенный выше код проверяет, существует ли каталог и доступен ли он для записи.

muralikrishna
источник
1
-a фактически идентичен -e. Это было "устарело", и его использование не рекомендуется.
кузен Кокаин
27
DIRECTORY=/tmp

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

Попробуй онлайн

Вишал
источник
запомни spaceпосле [-> [`` -d . я получил ошибку из-за недостатка места
Радж
4
СНОВА , этот ответ был дан уже в 2008 году с более полезными объяснениями. Единственная новинка здесь - онлайн-площадка.
Дан Даскалеску
24

Введите этот код в командной строке Bash:

if [ -d "$DIRECTORY" ]; then
    # If true this block of code will execute
fi
Сантош
источник
СНОВА , этот ответ был дан уже в 2008 году. Какой смысл повторять его ?!
Дан Даскалеску
21

Больше возможностей с помощью find

  • Проверьте наличие папки в подкаталогах:

    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
  • Проверьте наличие одной или нескольких папок на основе шаблона в текущем каталоге:

    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
  • Обе комбинации. В следующем примере проверяется наличие папки в текущем каталоге:

    found=`find -maxdepth 1 -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' is not empty => "myDirectory"` exists.
    fi
Нил Нейман
источник
Привет ниль Ваша идея может быть полезно , чтобы проверить наличие каталогов в зависимости от рисунка , как: find -maxdepth 1 -type d -name 'pattern'. Вы не против, если я добавлю в ваш ответ этот трюк? Приветствия;)
olibre
20

На самом деле, вы должны использовать несколько инструментов, чтобы получить пуленепробиваемый подход:

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

Нет необходимости беспокоиться о пробелах и специальных символах, пока вы используете "${}" .

Обратите внимание, что [[]]он не так переносим, ​​как [], но поскольку большинство людей работают с современными версиями Bash (поскольку, в конце концов, большинство людей даже не работают с командной строкой :-p), выгода больше, чем проблема.

е-удовлетворяться
источник
17

Рассматривали ли вы просто делать то, что вы хотите сделать, ifа не смотреть, прежде чем прыгать?

Т.е., если вы хотите проверить существование каталога, прежде чем вводить его, попробуйте просто сделать это:

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

Если путь, который вы даете, pushdсуществует, вы войдете в него, и он уйдет 0, что означаетthen завершите части инструкции. Если он не существует, ничего не произойдет (кроме некоторого вывода о том, что каталог не существует, что, вероятно, в любом случае является полезным побочным эффектом для отладки).

Кажется, лучше, чем это, что требует повторения:

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

То же самое работает с cd, mv, rmи т.д. ... если вы попробуете их на файлы , которые не существуют, они будут выходить с ошибкой и распечатать сообщение о том , что не существует, и ваш thenблок будет пропущен. Если вы попробуете их на существующих файлах, команда выполнится и выйдет со статусом 0, позволяющим thenвыполнить ваш блок.

ArtOfWarfare
источник
2
pushd для меня самый элегантный способ сделать это. Я собирался опубликовать это как ответ :)
melMass
16
[[ -d "$DIR" && ! -L "$DIR" ]] && echo "It's a directory and not a symbolic link"

Примечание: цитирование переменных - это хорошая практика.

Объяснение:

  • -d: проверьте, если это каталог
  • -L: проверьте, если это символическая ссылка
Jahid
источник
Объяснение будет в порядке ( отредактировав свой ответ , а не здесь, в комментариях).
Питер Мортенсен
15

Чтобы проверить более одного каталога, используйте этот код:

if [ -d "$DIRECTORY1" ] && [ -d "$DIRECTORY2" ] then
    # Things to do
fi
Раамеш Керти
источник
как вы можете проверить, что он не существует?
Perrohunter
15

Проверьте, существует ли каталог, иначе создайте его:

[ -d "$DIRECTORY" ] || mkdir $DIRECTORY
Дэвид Окви
источник
16
Вы можете использовать mkdir -p "$DIRECTORY"для того же эффекта.
Логан Пикап
13
[ -d ~/Desktop/TEMPORAL/ ] && echo "DIRECTORY EXISTS" || echo "DIRECTORY DOES NOT EXIST"
Хуан Карлос Кури Пинто
источник
Объяснение будет в порядке ( отредактировав свой ответ , а не здесь, в комментариях).
Питер Мортенсен
11

Этот ответ обернут как сценарий оболочки

Примеры

$ 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

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

if [ -e ${FILE_PATH_AND_NAME} ]
then
    echo "The file or directory exists."
fi
bailey86
источник
1
И не правильно отвечает на вопрос ОП - это каталог?
Марк Стюарт
8

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

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

mkdir -p /some/directory/you/want/to/exist || exit 1
kenorb
источник
7
if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists
fi

Это не совсем верно ...

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

Следовательно:

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

Используйте fileпрограмму. Учитывая, что все каталоги также являются файлами в Linux, достаточно выполнить следующую команду:

file $directory_name

Проверка несуществующего файла: file blah

Вывод: cannot open 'blah' (No such file or directory)

Проверка существующего каталога: file bluh

Вывод: bluh: directory

Судип Бхандари
источник
1
Хорошая идея, однако слишком плохая в обоих случаях команда file всегда возвращает 0 код выхода. Также, когда файл / каталог не может быть найден :(.
danger89
6

Команда 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
ztank1013
источник
+1, но если ISDIR вообще не существует, вы получаете сообщение об ошибке, а также диагностическое сообщение.
2011 г.
5

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

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

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

derFunk
источник
3
В качестве альтернативы вы можете использовать эту более короткую версию: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"

Если проблема обнаружена с помощью одного из подходов, указанных выше:

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

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

-ksh: not: not found [Нет такого файла или каталога]

Пиюш Байджал
источник
Что означает «выше»? Три командной строки в этом ответе или предыдущие ответы? (Пожалуйста, ответьте, отредактировав свой ответ , а не здесь, в комментариях. Заранее спасибо.).
Питер Мортенсен
4

Есть отличные решения, но в конечном итоге каждый сценарий потерпит неудачу, если вы не в нужном каталоге. Так что код такой:

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

выполнится успешно, только если в момент выполнения вы находитесь в каталоге, в котором есть подкаталог, который вы случайно проверили.

Я понимаю первоначальный вопрос примерно так: проверить, существует ли каталог независимо от положения пользователя в файловой системе. Так что использование команды 'find' может помочь:

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

Это решение хорошо, потому что оно позволяет использовать подстановочные знаки, полезную функцию при поиске файлов / каталогов. Единственная проблема состоит в том, что, если искомый каталог не существует, команда 'find' ничего не выведет на стандартный вывод (на мой вкус, это не элегантное решение) и, тем не менее, будет иметь нулевой выход. Может быть, кто-то может улучшить это.

Дромайктс
источник
13
Я был бы обижен, если бы программа просматривала весь мой жесткий диск, чтобы найти каталог, а не просто вежливо просматривала мой текущий рабочий каталог или использовала абсолютный путь, который я ему дал. То, что вы предложили, может быть хорошим для названного инструмента, locateно не хорошим для всего остального ...
sarnold