2015-01-06 9 views
16

sto usando il seguente comando per eliminare quattro file di dimensioni più grandi in una cartella:xargs: LS: terminati dal segnale 13

find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f 

Funziona bene, ma di volta in volta genera un errore tubo rotto:

xargs: ls: terminated by signal 13 

risposta

19

mi sono imbattuto in un problema simile e abbiamo trovato questo thread su ricerca di una risposta:

Signal 13 significa qualcosa è scritto ad un tubo dove nulla viene letta da più (ad esempio vedi http://people.cs.pitt.edu/~alanjawi/cs449/code/shell/UnixSignals.htm).

Il punto qui è che il comando ls come eseguito da xargs sta ancora scrivendo output quando il seguente comando head ha già ottenuto tutto l'input che desidera e ha chiuso il suo input-pipe. Quindi è sicuro da ignorare, eppure è brutto. Vedere anche la risposta accettata in https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error

2

Si sta terminando intenzionalmente il programma con head -n 4, che crea il tubo interrotto perché lo si è interrotto prima del termine del "chiamante". Dal momento che questo è previsto da voi, è possibile ignorare l'errore reindirizzando a /dev/null che scarta:

find "/var/www/site1/" -maxdepth 1 -type f | xargs ls -1S | head -n 4 | xargs -d '\n' rm -f 2>/dev/null