проверьте, существует ли каталог и удалите одной командой unix


110

Можно ли проверить, существует ли каталог, и удалить, если он существует, в Unix с помощью одной команды? У меня есть ситуация, когда я использую задачу ANT 'sshexec', где я могу запустить только одну команду на удаленном компьютере. И мне нужно проверить, существует ли каталог и удалить его ...


почему бы просто не использовать rmdir? если каталог не существует, произойдет сбой.
Ferruccio

4
Это не удастся. И ошибка в моем скрипте ANT. Это приведет к сбою моей сборки.
Ремо,

Использование mkdir -pигнорирует ошибки, если они уже существуют.
user562374

2
@ Ferruccio- использование rm -rf / dir_name не вызывает ошибки, но rm -rf / dir_name выдает сообщение, что такого файла или каталога не найдено. (Только что протестировано)
Ремо

3
@remo, братан, ты только что дважды опубликовал одну и ту же команду
Маркос Перейра

Ответы:


149

Предполагая, $WORKING_DIRчто установлен каталог ... этот однострочный должен сделать это:

if [ -d "$WORKING_DIR" ]; then rm -Rf $WORKING_DIR; fi

(в противном случае просто замените свой каталог)


168

Почему бы просто не использовать rm -rf /some/dir? Это удалит каталог, если он есть, иначе ничего не сделает. В отличие от rm -r /some/dirэтого варианта команда не выйдет из строя, если папка не существует.


13
Я думаю, что исходный вопрос должен был означать: выполнять удаление только тогда, когда файл / каталог существует или нет. Эта команда может работать и давать аналогичные результаты, но на самом деле выполнение теста перед командой имеет больше смысла.
Анкур Чаухан

5
@AnkurChauhan +1, я получил предупреждение, если каталог не существует.
inf3rno

12
Это не ответ на вопрос.
xpto

10
Как указано выше, это не ответ. Одна из причин для тестирования перед удалением - это работа Дженкинса. Если каталог не существует, и вы попытаетесь его удалить, это не сработает. Предварительная проверка - лучший вариант.
lumberjacked

8
Думаю, это правильный ответ. он делает то, что нужно @remo, т.е. удаляет каталог, только если он существует, и не выдает ошибку, если его нет. Может быть, вопрос не совсем хорошо поставлен, потому что зачем вам проверять существование, если этой команде все равно ?!
Pedram Bashiri

32

Пытаться:

bash -c '[ -d my_mystery_dirname ] && run_this_command'

EDIT : это будет работать, если вы можете запустить bash на удаленном компьютере ....

РЕДАКТИРОВАТЬ 2 : В bash [ -d something ]проверяет, есть ли каталог с именем «что-то», возвращая код успеха, если он существует и является каталогом. Объединение команд с помощью && запускает вторую команду только в том случае, если первая выполнена успешно. Поэтому [ -d somedir ] && commandкоманда запускается только в том случае, если каталог существует.


Да, и попробуйте в оболочке, чтобы убедиться, что это то, что вам нужно.
sinelaw

Сначала я хочу посмотреть, работает ли он локально, и им я могу отправить команду удаленно. Я хочу сказать, чтобы проверить каталог "/ test" ... просто [-d / test] && mkdir / test?
Ремо,

1
Он должен выдать ошибку, если он существует, потому что он проверяет, существует ли каталог, и если да, он пытается его создать. Это то, что он делает для меня (только что протестировал). Он не должен создавать каталог. Поскольку вы хотите УДАЛИТЬ, вам, вероятно, понадобится: [ -d /test ] && rmdir /test(или rm -rf / test, если он не будет пустым и вы хотите удалить все содержимое)
sinelaw

@SineLaw: ПРИМЕЧАНИЕ. - Это не ошибка, когда для меня существовал каталог и я пытался создать каталог! (проверил еще раз). Но для DELETE это работает. Пожалуйста, проверьте это дважды
Ремо

шарма: вы используете bash? что говорит 'echo $ SHELL'?
sinelaw

0

Вот еще один лайнер:

[[ -d /tmp/test ]] && rm -r /tmp/test
  • && означает выполнение следующей инструкции, только если предыдущая инструкция выполнена успешно (вернул нулевой код выхода)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.