Comando per l'eliminazione di file temporanei che terminano con ~

15

Molti giorni fa, ho trovato questo utile alias di bash (contenuto dei miei ~ / .bash_aliases )

# aliases

# finds temporary files ending with '~' and deletes them
alias rm~='find . -name '*~' -print0 | xargs -0 /bin/rm -f'

Ora ho provato a usare rm~ dopo cd in una directory contenente 3 file che terminano in ~

Ho ricevuto questo errore nel terminale e i file non sono stati cancellati

find: paths must precede expression: 1n.in~
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

Anche quando ho provato rm~ da /home/me , sembra che non stia facendo nulla. O potrebbe richiedere molto tempo.

Per favore dimmi perché sto ricevendo un errore e come risolverlo.

Grazie!

    
posta Vinayak Garg 28.12.2012 - 09:46

2 risposte

26

Il tuo alias bash non è scritto bene (le virgolette singole non sono ben usate). Invece dovrebbe essere:

alias rm~='find . -name "*~" -print0 | xargs -0 /bin/rm -f'

Ora, a me personalmente non piacciono gli usi inutili di pipe e xargs , quindi il tuo alias dovrebbe essere scritto meglio come:

alias rm~='find . -name "*~" -type f -exec /bin/rm -fv -- {} +'

L'opzione -type f in modo da trovare solo i file (non le directory, i link, ecc.), l'opzione -v su rm in modo da essere dettagliata (stampa ciò che sta eliminando). Il + alla fine in modo che find esegua rm con tutti i file trovati (genera una sola istanza di rm , invece di una per file).

Ora da man bash :

  

Per quasi tutti gli scopi, gli alias sono sostituiti dalle funzioni della shell.

Invece di un alias, è meglio usare una funzione: commenta il tuo alias nel file .bash_aliases (cioè, metti un # davanti a quella linea), e nel file .bashrc , metti questo < em> function (ovunque nel file, alla fine va bene):

rm~() {
    find . -name "*~" -type f -exec /bin/rm -fv -- {} +
}

Inoltre, come menziona l'altra risposta, puoi usare il comando -delete per trovare. In questo caso, la tua funzione rm~ sarà:

rm~() {
    find . -name "*~" -type f -printf "Removing file %p\n" -delete
}

In effetti, puoi creare una funzione interessante che prenderà un argomento, ad esempio --dry-run , che visualizzerà solo ciò che eliminerà:

rm~() {
    case "" in
    "--dry-run")
        find . -name "*~" -type f -printf "[dry-run] Removing file %p\n"
        ;;
    "")
        find . -name "*~" -type f -printf "Removing file %p\n" -delete
        ;;
    *)
        echo "Unsupported option \''. Did you mean --dry-run?"
        ;;
    esac
}

Quindi usa come:

rm~ --dry-run

per mostrare solo i file che saranno cancellati (ma non cancellarli) e poi

rm~

quando sei soddisfatto di questo.

Adatta ed estendi alle tue esigenze!

Nota. Dovrai aprire un nuovo terminale affinché le modifiche abbiano effetto.

    
risposta data gniourf_gniourf 28.12.2012 - 11:01
9

*~ viene espanso dalla shell prima che venga assegnato al tuo alias. L'assegnazione effettiva è:

alias rm~='find .name some~ file~ 1n.in~ -print0 | xargs -0 /bin/rm -f'

Suggerisco di utilizzare le funzioni al posto degli alias, sono molto più potenti e più facili da gestire rispetto alle virgolette.

Mentre ci siamo, rimuovi il superfluo . (la directory corrente è implicita se non vengono forniti parametri) e interrompi l'abuso di xargs poiché esiste già un'opzione -delete .

rm~() { find -name '*~' -ls -delete; }

L'opzione -ls è facoltativa, ma aggiungendola ti mostrerà quali file sono stati cancellati.

    
risposta data Lekensteyn 28.12.2012 - 09:54

Leggi altre domande sui tag