Не пытайтесь проверить, существует ли файл, просто попробуйте удалить его.
rm -f /p/a/t/h# or
rm /p/a/t/h 2>/dev/null
Обратите внимание, что вторая команда потерпит неудачу (вернет ненулевой статус завершения), если файл не существует, но первая будет выполнена успешно благодаря опции -f(сокращение --force). В зависимости от ситуации это может быть важной деталью.
Но, скорее всего, если вы добавляете файл, это потому, что ваш скрипт использует >>что-то для перенаправления в файл. Просто замените >>на >. Трудно сказать, так как вы не предоставили код.
Обратите внимание, что вы можете сделать что-то подобное test -f /p/a/t/h && rm /p/a/t/h, но делать это совершенно бессмысленно. Вполне возможно, что тест вернет true, но / p / a / t / h не будет существовать до того, как вы попытаетесь удалить его, или, что еще хуже, тест не пройдёт и будет создан / p / a / t / h. перед выполнением следующей команды, которая ожидает, что она не существует. Попытка это классическое состояние гонки. Не делай этого.
Это не полезно, если им нужно знать, существует ли он и был ли он удален. Еда stderr не обеспечивает этого. Отсутствие обработки существования не позволяет запустить более широкий скрипт без сбоев.
Учуугака
@uchuugaka Это простое решение , если вы не заботитесь , если файл существует, все , что вы хотите, чтобы убедиться сделать это не существует.
Лукас Лиезис
Хорошие ответы должны быть получены и полны о побочных эффектах - это обобщение моего сообщения, но сценарии оболочки часто хотят знать, что найдено или не найдено, а что есть или нет.
Учуугака
rm /p/a/t/h 2> /dev/nullне будет сохранять код возврата ( echo $?) как 0, если файл не существует. Это может привести к сбою заданий в Jenkins только потому, что мы попытались удалить несуществующий файл.
ViFI
@uchuugaka - Я довольно долго не отвечал на этот комментарий, но его нужно решить. Проверка, существует ли файл перед удалением, всегда плохая идея. Смотрите последний абзац моего ответа. Существует неотъемлемое состояние расы, которого просто невозможно избежать, совершая подобные вещи. Если вы не хотите перезаписывать существующий файл, вы можете попробовать какую-то особую магию для оболочки (например, noclobberв bash) или, возможно, изменить существующий файл, чтобы выполнить перенаправление, если файл существует (не избегает условия гонки), но все, что нужно сделать, это сделать ошибки более тонкими.
Уильям Перселл
128
Еще одна однострочная команда, которую я использовал:
Простой и легкий для чтения, а также гарантирует, что echo $?не дает 1, если файл не существует.
ViFI
При необходимости вы также можете сделать это в виде одной строки, см. Мой ответ ниже.
nbeuchat
65
Если вы хотите игнорировать шаг, чтобы проверить, существует ли файл или нет, то вы можете использовать довольно простую команду, которая удалит файл, если он существует, и не выдаст ошибку, если он не существует.
rm $my_file
, верно? Какую оболочку вы используете?Ответы:
Не пытайтесь проверить, существует ли файл, просто попробуйте удалить его.
Обратите внимание, что вторая команда потерпит неудачу (вернет ненулевой статус завершения), если файл не существует, но первая будет выполнена успешно благодаря опции
-f
(сокращение--force
). В зависимости от ситуации это может быть важной деталью.Но, скорее всего, если вы добавляете файл, это потому, что ваш скрипт использует
>>
что-то для перенаправления в файл. Просто замените>>
на>
. Трудно сказать, так как вы не предоставили код.Обратите внимание, что вы можете сделать что-то подобное
test -f /p/a/t/h && rm /p/a/t/h
, но делать это совершенно бессмысленно. Вполне возможно, что тест вернет true, но / p / a / t / h не будет существовать до того, как вы попытаетесь удалить его, или, что еще хуже, тест не пройдёт и будет создан / p / a / t / h. перед выполнением следующей команды, которая ожидает, что она не существует. Попытка это классическое состояние гонки. Не делай этого.источник
rm /p/a/t/h 2> /dev/null
не будет сохранять код возврата (echo $?
) как 0, если файл не существует. Это может привести к сбою заданий в Jenkins только потому, что мы попытались удалить несуществующий файл.noclobber
в bash) или, возможно, изменить существующий файл, чтобы выполнить перенаправление, если файл существует (не избегает условия гонки), но все, что нужно сделать, это сделать ошибки более тонкими.Еще одна однострочная команда, которую я использовал:
источник
Вы можете использовать это:
источник
echo $?
не дает 1, если файл не существует.Если вы хотите игнорировать шаг, чтобы проверить, существует ли файл или нет, то вы можете использовать довольно простую команду, которая удалит файл, если он существует, и не выдаст ошибку, если он не существует.
источник
-f
он не выдаст ошибку. Этот ответ помог мне, спасибо.Сценарий оболочки с одним вкладышем для удаления файла, если он уже существует (основываясь на ответе Джиндры Хелкл):
[ -f file ] && rm file
или с переменной:
источник
Примерно так будет работать
-f проверяет, является ли это обычный файл
-e проверяет, существует ли файл
РЕДАКТИРОВАТЬ: -e используется с -f излишним, fo использование только -f тоже должно работать
источник
-a
устарела, используйте-e
вместо.-f
.-e
in-fe
является избыточным, так как-f
также проверяет наличие файла, насколько я знаю ..if [ $( ls <file> ) ]; then rm <file>; fi
Кроме того, если вы перенаправите вывод с помощью
>
вместо>>
него, будет перезаписан предыдущий файлисточник
file
что-то вроде5 -lt 2