перевірити, чи існує каталог, і видалити в одній команді unix


107

Чи можна перевірити, чи існує каталог, і видалити, якщо він є, в Unix за допомогою однієї команди? У мене ситуація, коли я використовую завдання ANT 'sshexec', де я можу запустити лише одну команду на віддаленій машині. І мені потрібно перевірити, чи існує каталог, і видалити його ...


чому б просто не використовувати rmdir? якщо каталог не існує, він вийде з ладу.
Ферруччо

4
Це не вдасться. І помилка в моєму сценарії ANT. Це призведе до краху моєї збірки.
видалити

Використання mkdir -pбуде ігнорувати помилки, якщо вони вже є.
користувач562374

2
@ Ferruccio- за допомогою rm -rf / dir_name не видає помилки, але rm -rf / dir_name кидає, що такого файлу чи каталогу не знайдено. (Щойно перевірено)
видалити

3
@remo bro, ти щойно опублікував одну і ту ж команду
Marcos Pereira

Відповіді:


149

Якщо припустимо, що $WORKING_DIRце встановлено в каталог ... цей однолінійний параметр повинен зробити це:

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

(інакше просто замініть ваш каталог)


163

Чому б просто не використовувати rm -rf /some/dir? Це видалить каталог, якщо він є, інакше нічого не робити. На відміну від rm -r /some/dirцього аромат команди не зірветься, якщо папка не існує.


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

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

12
Це не відповідь на запитання.
xpto

10
Як зазначено вище, це не відповідь. Однією з причин тестування перед видаленням буде робота в Дженкінсі. Якщо каталог не існує, і ви спробуєте його видалити, це не вдасться виконати завдання. Попередня перевірка - кращий варіант.
Дроворуб

8
Я думаю, що це правильна відповідь. він робить те, що потрібно @remo, тобто видаляє каталог лише в тому випадку, якщо він існує, і не видає помилку, якщо він не є. Можливо, питання не дуже добре поставлене, тому що навіщо вам перевіряти існування, коли ця команда не піклується ?!
педрам баширі

32

Спробуйте:

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

EDIT : Це спрацює, якщо ви можете запустити bash на віддаленій машині ....

EDIT 2 : У bash [ -d something ]перевіряється, чи є в каталозі "щось", повертаючи код успіху, якщо він існує та є каталогом. Прив'язування команд && запускає другу команду лише в тому випадку, якщо перша вдалася. Тому [ -d somedir ] && commandвиконується команда, лише якщо каталог існує.


Так, і спробуйте це в оболонці, щоб переконатися, що це те, що ви хочете.
sinelaw

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

1
Він повинен дати помилку, якщо вона існує, тому що вона перевіряє, чи існує каталог, і якщо так, він намагається створити його. Ось що це робить для мене (щойно перевірено). Він не повинен створювати каталог. Так як ви хочете видалити , Ви , ймовірно , необхідно: [ -d /test ] && rmdir /test(або ГТ -rf / тест , якщо він не буде порожнім , і ви хочете , щоб видалити весь вміст)
sinelaw

@SineLaw: ПРИМІТКА - Він не помилився, коли для мене існував каталог, і намагався створити каталог! (ще раз перевірено). Але для DELETE це працює. Перевірте це
видаліть

шарма: ти використовуєш баш? що говорить 'echo $ SHELL'?
sinelaw

0

Ось ще один вкладиш:

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