2016-04-14 26 views
9

Ich sehe, dass diese Frage immer beliebter wird. Ich beantwortete meine eigene Frage unten. Was sagt Inian ist richtig und es half mir, meinen Quellcode besser zu analysieren.Fehler 'rm: fehlender Operand' bei der Verwendung zusammen mit 'finden' Befehl

Mein Problem war in den FIND und nicht in den RM. Meine Antwort gibt einen Block von Code, den ich gerade verwende, um Probleme zu vermeiden, wenn FIND nichts findet, aber trotzdem Argumente an RM weitergibt, was den oben erwähnten Fehler verursacht.

ALTE FRAGE UNTER

Ich schreibe viele und viele andere Version des gleichen Befehl. Alle werden ausgeführt, aber mit einem Fehler/Infos:

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

Dies sind die Befehle, die ich bin mit:

#!/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 

Ich bin sicher, dass sie alle korrekt sind (weil sie alle tun Job), und wenn ich sie manuell ausführen, bekomme ich diese Nachricht nicht zurück, aber während ich in einem .sh-Skript tue.

EDIT: da ich viele dieser RM habe, könnte das Problem woanders sein. Ich überprüfe alle. Alle oben genannten Codes funktioniert, aber die beste Antwort ist die, markiert;)

+0

Mögliches Duplikat von [Leeres Ergebnis für Xargs ignorieren] (https://stackoverflow.com/questions/8296710/ignore-empty-result-for-xargs) – jazzmax

+0

Ihre Frage sollte eine Frage bleiben. Ich würde Ihre Änderung rückgängig machen, aber ich hoffe, Ihnen die Chance zu geben, Ihren neuen Text als Antwort zu veröffentlichen, bevor Sie die Änderung rückgängig machen. (Es wird immer noch von der Bearbeitungsgeschichte verfügbar sein, die Sie erhalten, indem Sie auf den "bearbeiteten (Datum)" Hinweis natürlich klicken.) – tripleee

+0

@tripleee Hallo, ich habe den Beitrag bearbeitet. Ich hoffe ich habe es richtig gemacht! Danke, dass Sie es bemerkt haben. – Nihvel

Antwort

16

Das Problem ist, wenn nur, wenn der vorherige Befehl erfolgreich mit find/grep zusammen mit xargs müssen Sie sicher sein, die verrohrt Befehl auszuführen. Wenn im obigen Fall der Befehl find keine Suchergebnisse erzeugt, wird der Befehl rm mit einer leeren Argumentliste aufgerufen.

Die man Seite von 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. 

Hinzu kommt, dass Sie nicht alle Befehle, um zu versuchen, wie Sie die folgenden einfachen klebte Ihren Bedarf anpassen wird.

Fügen Sie die -r Argument xargs wie

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

-f Option von rm unterdrückt die rm: missing operand Fehler:

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

Nach Untersuchungen der Befehl, den ich bequem bin mit ist:

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} 

Warum? Ich suche alle alten Ordner, die ich löschen möchte und drucke sie alle in eine Datei, unabhängig von ihrer Benennung mit oder ohne Leerzeichen. Wenn die Datei größer als 0 Byte ist, bedeutet dies, dass es Ordner gibt, die ich nicht mehr möchte.

Wenn Ihr ‚FIND‘ nicht mit einem ‚rm: fehlender Operand‘, es ist wahrscheinlich nicht selbst in den RM eher im FIND zu suchen. Eine gute Möglichkeit zum Entfernen der Datei mit FIND, ist die, die ich mit Ihnen teilen wollte.