скрипт оболонки для видалення файлу, якщо він вже існує


183

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

Я хочу допомогти, як я можу видалити файл, якщо він уже існує.


3
Перевірте, чи існує файл ..., а потім зателефонуйте rm $my_file, правда? Яку оболонку ви використовуєте?
Chris Sprague

Відповіді:


184

Не турбуйтеся перевіряти, чи існує файл, просто спробуйте видалити його.

rm -f /p/a/t/h
# or
rm /p/a/t/h 2> /dev/null

Зверніть увагу, що друга команда не вдасться (поверне ненульовий статус виходу), якщо файл не існував, але перша вдасться завдяки опції -f(short for --force). Залежно від ситуації це може бути важливою деталлю.

Але ймовірніше, якщо ви додаєте файл, це тому, що ваш скрипт використовується >>для перенаправлення чогось у файл. Просто замініть >>на >. Важко сказати, оскільки ви не надали код.

Зауважте, що ви можете робити щось подібне test -f /p/a/t/h && rm /p/a/t/h, але робити це абсолютно безглуздо. Цілком можливо, що тест повернеться істинним, але / p / a / t / h не буде існувати до того, як ви його спробуєте видалити, або ще гірше тест не вдасться і буде створено / p / a / t / h перед тим, як виконати наступну команду, яка передбачає, що вона не існує. Спроба цього - класична умова гонки. Не робіть цього.


5
Це не корисно, якщо вони повинні знати, чи вона існувала та чи була видалена. Їжа stderr цього не забезпечує. Якщо не обробляти існування, це не дозволяє вам виконати більш широкий сценарій без відмови.
uchuugaka

@uchuugaka Це просте рішення , якщо ви не дбаєте , якщо файл існує, все , що ви хочете, щоб переконатися зробити це НЕ існує.
Лукас Лейсіс

Хороші відповіді мають бути найближчими та повними щодо побічних ефектів - це узагальнення мого повідомлення, але сценарії оболонок часто хочуть знати, що є, чи не знайдено, а що є чи ні.
uchuugaka

rm /p/a/t/h 2> /dev/nullне збереже код повернення ( echo $?) як 0, якщо файл не існував. Це призвело б до того, що роботу Дженкінса не вдалося зробити лише тому, що ми намагалися видалити неіснуючий файл.
ViFI

@uchuugaka - Я досить довго уникаю відповідати на цей коментар, але це потрібно вирішити. Перевірка наявності файлу перед видаленням - це завжди погана ідея. Дивіться заключний параграф моєї відповіді. Існує властива умова раси, якої просто не можна уникнути, роблячи подібні речі. Якщо ви не хочете перезаписати існуючий файл, ви можете спробувати якусь магію, специфічну для оболонки (наприклад, noclobberу bash), або, можливо, chmod-ing існуючого файлу, щоб перенаправлення не вдалося, якщо файл існує (не уникнути умови перегону), але все, що буде робити, це зробити помилок більш тонкими.
Вільям Перселл

127

Ще одна командна лінія, яку я використав:

[ -e file ] && rm file

11
Або альтернативно: [! -е файл] || rm-файл. Ця версія повертає 0 замість деякої помилки.
nawfel bgh

@nawfelbgh Дякую, це чудово підходить для прив’язки до більш тривалого сценарію.
Абе

83

Ви можете скористатися цим:

#!/bin/bash

file="file_you_want_to_delete"

if [ -f $file ] ; then
    rm $file
fi

4
Це має бути обрана відповідь.
ingernet

Простий і легкий для читання, а також гарантує, що echo $?не дає 1, якщо файл не існує.
ViFI

Якщо потрібно, ви також можете це зробити як однолінійний, дивіться мою відповідь нижче.
nbeuchat

65

Якщо ви хочете ігнорувати крок, щоб перевірити, чи існує файл чи ні, тоді ви можете скористатися досить простою командою, яка видалить файл, якщо він існує, і не видасть помилку, якщо він не існує.

 rm -f xyz.csv

1
Це лише дублікат частини найбільш
прощання

16
основна відповідь не пояснила, що з цим -fвоно не призведе до помилки. Ця відповідь мені допомогла, дякую.
Дуг

Погодьтеся з Дугом, хоча це здається гарним випадком використання для редагування відповіді у вікі.
Філіп

16

Сценарій оболонки з одним вкладишем для видалення файлу, якщо він вже існує (на основі відповіді Джіндри Гекл):

[ -f file ] && rm file

або зі змінною:

#!/bin/bash

file="/path/to/file.ext"
[ -f $file ] && rm $file

13

Щось подібне спрацювало б

#!/bin/sh

if [ -fe FILE ]
then 
    rm FILE
fi 

-f перевіряє, чи це звичайний файл

-e перевіряє, чи файл існує

Вступ до, якщо для отримання додаткової інформації

EDIT: -e, що використовується з -f, є надлишковим, для використання -f тільки повинно працювати також


-aзастаріло, -eзамість цього використовуйте .
mziccard

моя погана, виправлена. Спасибі @mziccard
P1kachu

це призведе до помилок у каталогах чи посиланнях чи інших ненормованих файлах. Це краще / безпечніше використовувати -f.
Jindra Helcl

1
гаразд. все-таки, -eв -feнадлишку, як -fі перевіряє існування файлу, наскільки я знаю ..
Jindra Helcl

Якщо я редагую, я просто зроблю копію з вашої відповіді, але я її точно
уточну

4

if [ $( ls <file> ) ]; then rm <file>; fi

Крім того, якщо ви переспрямовуєте свій висновок >замість >>нього, він замінить попередній файл


3
це не однолінійний, вибачте, але @liwp_Stephen - це те.
fiorentinoing

Навіть якщо це правильно цитується, це зламається, якщо fileщось подібне5 -lt 2
Вільям Перселл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.