2009-04-01 11 views
66

Ho alcuni file sulla mia macchina Unix che iniziano conCome rimuovere i file che iniziano con il doppio trattino?

-- 

esempio --testings.html

Se provo a toglierlo ottengo il seguente errore:

cb0$ rm --testings.html 
rm: illegal option -- - 
usage: rm [-f | -i] [-dPRrvW] file ... 
     unlink file 

ho cercato

rm "--testings.html" || rm '--testings.html' 

ma niente funziona.

Come posso rimuovere tali file sul terminale?

+0

Uguale a [serverfault] (https://serverfault.com/questions/47003/deleting-a-unix-directory-with-a-hyphen-in-the-name) e [unix] (https: // unix.stackexchange.com/questions/1519/how-do-i-delete-a-file-whose-name-begins-with-hyphen-aka-dash-or-minus). – Dorian

+1

@Dorian Beh, ok, ma sono stato il primo :) – cb0

risposta

140
rm -- --testings.html 

L'opzione -- dice rm per il trattamento di tutti gli ulteriori argomenti come i nomi dei file, non come le opzioni, anche se iniziano con -.

Questo non è specifico per il comando rm. La funzione getopt lo implementa e molti (tutti?) I comandi in stile UNIX lo trattano allo stesso modo: termina l'elaborazione dell'opzione e qualsiasi cosa dopo che è un argomento regolare.

http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt

+0

esattamente ciò di cui ho bisogno, grazie – cb0

+4

Questo non è lo standard per tutte le versioni di Unix, sebbene funzioni di più. Vedi la risposta di vatine per un'alternativa che funziona con tutte le versioni. –

17

Sia rm -- --testings.html o rm ./--testings.html.

1
rm ./--testings.html 

o

rm -- --testings.html 
55
rm -- --somefile 

Mentre che funziona, è una soluzione che si basa su rm Utilizzare getopts per analizzare le sue opzioni. Ci sono applicazioni là fuori che fanno il loro proprio parsing e si vomiteranno anche su quello (perché potrebbero non necessariamente implementare la logica "-- significa fine delle opzioni").

A causa di ciò, la soluzione si dovrebbe guidare attraverso il cranio è questa:

rm ./--somefile 

E funziona sempre, perché in questo modo le sue argomentazioni non iniziano con un -.

Inoltre, se si sta tentando di creare script di shell davvero decenti; dovresti mettere tecnicamente ./ di fronte a tutte le espansioni dei parametri del nome del file per impedire che gli script si rompano a causa dell'input funky del nome del file (o per evitare che vengano abusati/sfruttati per fare cose che non dovrebbero fare: ad esempio, rm elimina i file ma salta le directory, mentre lo standard rm -rf * eliminerà tutto. Passare un nome file di "-rf" a uno script o a qualcuno touch ~victim/-rf "in questo modo potrebbe essere utilizzato per modificare il suo comportamento con conseguenze davvero negative).

+2

+1 perché hai ragione, ma rendere gli script a prova di proiettile è un altro problema oltre a gestire un unico nome di file. Se la domanda fosse "come faccio a rimuovere i file che iniziano con trattini o contenenti spazi,;, <>, $, e altra roba dannosa", allora avrebbe bisogno della risposta completa :-) –

4

Un altro modo per farlo è usare find ...-name "- *" -delete

touch -- --file 
find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete 
3

Per un approccio più generalizzato per l'eliminazione di file con i caratteri impossibili nel nome del file, una possibilità è quella di utilizzare l'inode del file.

Può essere ottenuto tramite ls -i.

ad es.

$ ls -lai | grep -i test 
452998712 -rw-r--r-- 1 dim dim  6 2009-05-22 21:50 --testings.html 

E per cancellarlo, con l'aiuto di ritrovamento:

$ find ./ -inum 452998712 -exec rm \{\} \; 

Questo processo può essere utile quando si tratta di un sacco di file con peculiarità nome del file, in quanto può essere facilmente script.

+1

Che funziona solo perché invoca 'rm' con l'argomento './-- testings.html'. È più semplice scrivere direttamente 'rm ./-- testings.html' - che non ha bisogno di attraversare l'intero albero delle directory. (Puoi evitare quest'ultimo usando '-maxdepth 1'.) –

Problemi correlati