2016-04-14 17 views
9

Vedo che questa domanda sta diventando popolare. Ho risposto alla mia domanda qui sotto. Cosa dice Inian è corretto e mi ha aiutato ad analizzare meglio il mio codice sorgente.Errore 'rm: missing operando' quando si utilizza insieme al comando 'trova'

Il mio problema era nello FIND e non nello RM. La mia risposta fornisce un blocco di codice, che sto attualmente usando, per evitare problemi quando FIND non trova nulla, ma ancora passerebbe argomenti a RM, causando l'errore di cui sopra.

DOMANDA VECCHIO SOTTO

sto scrivendo molti e molti versione diversa dello stesso comando. Tutto, vengono eseguiti ma con un errore/info:

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

Questi sono i comandi che sto usando:

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

Sono sicuro che tutti sono corretti (perché tutti fanno il loro lavoro), e se li eseguo manualmente non riesco a recuperare il messaggio, ma mentre lo faccio in uno script .sh.

EDIT: poiché ho molti di questi RM, il problema potrebbe essere altrove. Li sto controllando tutti. Tutti i codici sopra indicati funzionano ma la migliore risposta è quella contrassegnata;)

+0

Possibile duplicato di [Ignora risultato vuoto per xargs] (https://stackoverflow.com/questions/8296710/ignore-empty-result-for-xargs) – jazzmax

+0

La tua domanda dovrebbe rimanere una domanda. Vorrei ripristinare la modifica, ma spero di darti la possibilità di pubblicare il tuo nuovo testo come risposta, invece di ripristinare la modifica. (Sarà ancora disponibile dalla cronologia delle modifiche che si ottiene facendo clic sull'avviso "modificato (data)", ovviamente.) – tripleee

+0

@ tripleee ciao, ho modificato il post. Spero di averlo fatto bene! Grazie per averlo notato – Nihvel

risposta

16

Il problema si verifica quando si utilizza find/grep insieme a xargs per eseguire il comando di piping solo se il comando precedente ha esito positivo. Come nel caso precedente, se il comando find non produce risultati di ricerca, il comando rm viene richiamato con un elenco di argomenti vuoto.

La man pagina del 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. 

Inoltre, non fare per cercare tutti i comandi, come si è incollato al di sotto semplice soddisferà il vostro bisogno.

aggiungere l'argomento -r a xargs come

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

-f possibilità di rm sopprime l'errore rm: missing operand:

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

Dopo ricerche, il comando sono confortevoli utilizzando è:

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} 

Perché? Ricerco tutte le vecchie cartelle che voglio eliminare e le stampo tutte in un file, indipendentemente dalla loro denominazione con o senza spazio. Se il file è più grande di 0 byte ciò significa che non ci sono cartelle che non voglio più.

Se il "TROVARE" non riesce con un 'rm: operando mancante', probabilmente non è cercare nella RM piuttosto nel FIND stesso. Un buon modo per rimuovere il file usando FIND è quello che sentivo di condividere con voi.