Не сообщать ли rm, когда файл отсутствует?

Как упоминает Томас в его ответе оболочка, используемая make , отличается от оболочки, которую вы используете при запуске сценария вручную.

Как правило, если вы используете в сценарии функции, относящиеся к определенной оболочке, вы должны поместить эту конкретную оболочку в строку shebang.

Например:

#!/bin/bash
echo -e "This is \033[0;31mRED\033[0m"
41
30.04.2016, 16:54
8 ответов

Используйте параметр -f . Он будет игнорировать несуществующие файлы.

От man rm :

   -f, --force
          ignore nonexistent files and arguments, never prompt

[Часть "никогда не запрашивать" означает что (a) -f отменяет любой ранее указанный параметр -i или -I , и (b) защищенные от записи файлы будут удалены без запроса.]

Пример

Без -f , rm будет жаловаться на отсутствующие файлы:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

С -f он будет молчать:

$ rm -f nonesuch
$
131
27.01.2020, 19:35

Проверьте параметр - force ( -f ) для rm :

-f, - force

игнорировать несуществующие файлы и аргументы, никогда не запрашивать

3
27.01.2020, 19:35

Есть два основных способа: Если вы добавите параметр -f, то он не будет показывать ошибку "не существует" и два: (работает почти для любой команды) вместо того, чтобы просто выполнить команду "thecommand", выполните "thecommand 2>/dev/null", где "thecommand" - это команда, которую вы выполняете.

-1
27.01.2020, 19:35

Вы заявили, что все еще хотите видеть другие результаты команды rm при ее выполнении, но использование опции -f подавит их. Вам нужно будет отфильтровать STDERR для того, что вам нужно, что немного сложно, учитывая, что вы хотите, чтобы все остальное отображалось.

Вы захотите использовать команду, подобную этой:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

Объяснение команды:

  • -f аргумент для принудительного выполнения и без запроса подтверждения или ошибок
  • 3>&1 1>&2 2>&3 3>&- для переключения между STDOUT и STDERR для фильтрации (вы можете прочитать больше об этом здесь, если хотите
  • | grep -v 'No such file or directory' для фильтрации сообщения, которое вы не хотите видеть

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

rm filename 2> /dev/null

Эта команда перенаправляет STDERR в /dev/null, поэтому вы не увидите его при выполнении команды.

8
27.01.2020, 19:35

Если вы хотите, чтобы rm не жаловался на отсутствующие файлы, но вам также нужен любой другой вывод от rm, я бы предложил сначала проверить существование целевого файла и вызывать rm (без флага -f) только если файл действительно существует.

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

Вызов rm -f на файле, который, например, не имеет прав пользователь-запись, удалит файл и также не выдаст обычного для этого сценария приглашения.

Если вы хотите использовать ту же идею с несколькими файлами, я бы создал определение функции, например:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

Используйте ее следующим образом: qrm file1 file2-does-not-exist *.txt etc here

12
27.01.2020, 19:35

Вы можете использовать -f, так как он, согласно man-странице, будет:

Пытаться удалить файлы без запроса на подтверждения, независимо от разрешений файла. Если файл не существует, не выводите диагностическое сообщение и не изменяйте статус выхода, чтобы отразить ошибку. не выводите диагностическое сообщение и не изменяйте статус выхода для отражения ошибки. также помните Опция -f отменяет все предыдущие опции -i.

rm -f xyz-directory

ничего не подскажет и сделает именно то, что вы хотите.

0
27.01.2020, 19:35

В качестве альтернативы вы можете использовать команду find с опцией -delete . Это (очевидно) удалит только файлы, которые он найдет, поэтому никогда не предупреждает, если их нет. Примером может быть:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

, который будет искать в каталоге / var / log / triffids / и удалять все файлы с суффиксом .log , которые не изменялись более 30 дней.

Всегда рекомендуется запускать эти команды без опции -delete , чтобы убедиться, что она находит нужные файлы.

5
27.01.2020, 19:35

Это взлом, но вы всегда можете коснуться файла, который собираетесь удалить. Если он не существует, он будет создан, чтобы rm мог его удалить.

3
27.01.2020, 19:35

Теги

Похожие вопросы