2016-04-14 3 views
9

Я вижу, что этот вопрос становится популярным. Я ответил на свой вопрос ниже. Что говорит Inian является правильным, и это помогло мне лучше проанализировать мой исходный код.Ошибка 'rm: missing operand' при использовании вместе с командой 'find'

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

OLD ВОПРОС НИЖЕ

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

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 

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

EDIT: поскольку у меня есть многие из этих RM, проблема может быть где-то в другом месте. Я проверяю их все. Все приведенные выше коды работают, но лучшим ответом является тот, который отмечен;)

+0

Возможный дубликат [Игнорировать пустой результат для xargs] (https://stackoverflow.com/questions/8296710/ignore-empty-result-for-xargs) – jazzmax

+0

Ваш вопрос должен оставаться вопросом. Я бы отменил ваше редактирование, но я надеюсь дать вам возможность опубликовать ваш новый текст в качестве ответа вместо того, чтобы отменить изменение. (Он по-прежнему будет доступен из истории редактирования, которую вы получите, щелкнув по значку «отредактированный (дата)», очевидно.) – tripleee

+0

@tripleee hello, я отредактировал сообщение. Надеюсь, я сделал это правильно! Спасибо, что заметили это. – Nihvel

ответ

16

Проблема заключается в том, что при использовании find/grep вместе с xargs вам необходимо выполнить команду pipeed, только если предыдущая команда выполнена успешно. Как и в вышеприведенном случае, если команда 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 
2

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

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

После исследований, команда, я комфортно, используя это:

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 байт, это означает, что у меня больше нет папки.

Если ваш «FIND» терпит неудачу с «rm: missing operand», вероятно, это не поиск в RM, а в самом FIND. Хороший способ удаления файла с помощью FIND - это тот, который я решил поделиться с вами.

Смежные вопросы