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


15

Molti giorni fa, ho trovato questo utile alias 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 cduna directory contenente 3 file che terminavano~

Ho riscontrato questo errore nel terminale e i file non sono stati eliminati

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, esso sembra fare nulla. O potrebbe richiedere molto tempo.

Per favore, dimmi perché visualizzo l'errore e come risolverlo.

Grazie!

Risposte:


26

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

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

Ora, personalmente non mi piacciono gli usi inutili delle pipe e xargs, quindi il tuo alias sarebbe meglio scritto come:

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

L' -type fopzione per trovare solo i file (non directory, collegamenti, ecc.), L' -vopzione rmper essere così dettagliata (stampa ciò che sta eliminando). Alla +fine così che findcorrerm venga con tutti i file trovati (genera solo un'istanza rminvece di una per file).

Adesso da man bash :

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

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

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

Inoltre, come menzionato nell'altra risposta, è possibile utilizzare il -deletecomando per trovare. In questo caso, la tua rm~funzione sarà:

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

In effetti, puoi fare una bella funzione che prenderà un argomento, diciamo --dry-run, che produrrà solo ciò che eliminerà:

rm~() {
    case "$1" 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 \`$1'. Did you mean --dry-run?"
        ;;
    esac
}

Quindi utilizzare come:

rm~ --dry-run

per mostrare solo i file che verranno eliminati (ma non eliminarli) e quindi

rm~

quando sei felice con questo.

Adatta ed estendi alle tue esigenze!

Nota. Dovrai aprire un nuovo terminale per rendere effettive le modifiche.


Grazie! Funziona bene e la corsa a secco è estremamente utile.
Vinayak Garg,

2
find -type f -name '*~' -delete(arma scelta, inoltre git clean -dfx .)
vedi il

2
Questa è una soluzione così elegante, ho dovuto effettuare il login solo per darti oggetti di scena. +1 a te, mio ​​caro amico!
CodeChimp,

9

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

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

Suggerisco di usare le funzioni invece degli alias, sono molto più potenti e più facili da gestire rispetto alle citazioni.

Mentre ci siamo, rimuovere il superfluo .(la directory corrente è implicita se non vengono forniti parametri) e smettere di abusare xargspoiché -deleteesiste già un'opzione.

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

L' -lsopzione è facoltativa, ma l'aggiunta ti mostrerà quali file sono stati eliminati.


+1 Grazie! Ma dove aggiungo questa funzione?
Vinayak Garg,

@VinayakGarg Puoi aggiungerlo anche al tuo .bash_aliases, ma di solito li metto direttamente nel mio .bashrc.
Lekensteyn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.