Ошибка «rm: отсутствует операнд» при использовании вместе с командой «найти»

Я вижу, что этот вопрос становится популярным. Я ответил на свой вопрос ниже. То, что говорит Inian, верно, и это помогло мне лучше проанализировать мой исходный код.

Моя проблема была в FIND, а не в RM. Мой ответ дает блок кода, который я сейчас использую, чтобы избежать проблем, когда FIND ничего не находит, но все же передает аргументы в RM, вызывая упомянутую выше ошибку.

СТАРЫЙ ВОПРОС НИЖЕ

Я пишу много и много разных версий одной и той же команды. Все выполняется, но с ошибкой/информацией:

rm: missing operand
Try 'rm --help' for more information.

Это команды, которые я использую:

#!/bin/bash
BDIR=/home/user/backup
find ${BDIR} -type d -mtime +180 -print -exec rm -rf {} \;
find ${BDIR} -type d -mtime +180 -print -exec rm -rf {} +
find "$BDIR" -type d -mtime +180 -print -exec rm -rf {} \;
find "$BDIR" -depth -type d -mtime +180 -print -exec rm -rf {} \;
find ${BDIR} -depth -type d -mtime +180 -print -exec rm -rf {} +

find $BDIR -type d -mtime +180 -print0 | xargs -0 rm -rf

DEL=$(FIND $BDIR -type d -mtime +180 -print)
rm -rf $DEL

Я уверен, что все они верны (потому что все они выполняют свою работу), и если я запускаю их вручную, я не получаю это сообщение обратно, но в сценарии .sh я получаю.

РЕДАКТИРОВАТЬ: поскольку у меня много таких RM, проблема может быть где-то еще. Я проверяю их всех. Все приведенные выше коды работают, но лучший ответ - отмеченный;)


person aPugLife    schedule 14.04.2016    source источник
comment
Возможный дубликат Игнорировать пустой результат для xargs   -  person jazzmax    schedule 06.12.2017
comment
Ваш вопрос должен оставаться вопросом. Я бы отменил ваше редактирование, но я надеюсь дать вам возможность вместо этого опубликовать новый текст в качестве ответа, прежде чем отменить изменение. (Очевидно, что оно по-прежнему будет доступно из истории редактирования, которую вы получите, нажав на отредактированное (дата) уведомление.)   -  person tripleee    schedule 07.12.2017
comment
@tripleee привет, я отредактировал сообщение. надеюсь правильно сделал! Спасибо, что заметили это   -  person aPugLife    schedule 07.12.2017
comment
Это улучшение, хотя у меня все еще будет соблазн удалить комментарий или, может быть, переместить его в ваш ответ. Но спасибо за исправление!   -  person tripleee    schedule 07.12.2017


Ответы (3)


Проблема в том, что при использовании find/grep вместе с xargs вам нужно обязательно запускать переданную команду только в том случае, если предыдущая команда выполнена успешно. Как и в приведенном выше случае, если команда find не дает никаких результатов поиска, команда rm вызывается с пустым списком аргументов.

man страница xargs

 -r      Compatibility with GNU xargs.  The GNU version of xargs runs the
         utility argument at least once, even if xargs input is empty, and
         it supports a -r option to inhibit this behavior.  The FreeBSD
         version of xargs does not run the utility argument on empty
         input, but it supports the -r option for command-line compatibil-
         ity with GNU xargs, but the -r option does nothing in the FreeBSD
         version of xargs.

Более того, вам не нужно пробовать все команды, как вы вставили приведенную ниже простую, которая удовлетворит ваши потребности.

Добавьте аргумент -r в xargs, например

find "$BDIR" -type d -mtime +180 -print0 | xargs -0 -r rm -rf
person Inian    schedule 14.04.2016

-f опция rm подавляет ошибку rm: missing operand:

-f, --force 
       ignore nonexistent files and arguments, never prompt
person Jingguo Yao    schedule 24.12.2016
comment
Семантически более правильно вообще не вызывать rm, когда ему нечего запускать. - person Ro Achterberg; 04.03.2019

После исследований мне удобно использовать команду:

HOME=/home/user
FDEL=$HOME/foldersToDelete
BDIR=/backup/my_old_folders
FLOG=/var/log/delete_old_backup.log
find ${BDIR} -mindepth 1 -daystart -type d -mtime +180 -printf "%f\n" > ${FDEL}
if [[ $? -eq 0 && $(wc -l < ${FDEL}) -gt 0 ]]; then
    cd ${BDIR}
    xargs -d '\n' -a ${FDEL} rm -rf
  LOG=" - Folders older than 180 were deleted"
else
  LOG=" - There aren't folders older than 180 days to delete"
fi
echo ${LOG} >> ${FLOG}

Почему? Я просматриваю все старые папки, которые хочу удалить, и распечатываю их все в файл, независимо от их названия с пробелом или без него. Если файл больше 0 байт, это означает, что есть папка, которую я больше не хочу.

Если ваш 'НАЙТИ' завершается с ошибкой 'rm: отсутствует операнд', вероятно, это не поиск в RM, а в самом НАЙТИ. Я решил поделиться с вами хорошим способом удаления файла с помощью FIND.

person aPugLife    schedule 07.12.2017