Ho alcuni file sul mio computer Unix che iniziano con
--
per esempio --testings.html
Se provo a rimuoverlo ottengo il seguente errore:
cb0$ rm --testings.html rm: illegal option -- - usage: rm [-f | -i] [-dPRrvW] file ... unlink file
Provai
rm "--testings.html" || rm '--testings.html'
ma niente funziona.
Come posso rimuovere tali file sul terminale?
rm -- --testings.html
L’opzione --
indica a rm di trattare tutti gli altri argomenti come nomi di file, non come 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: --
interrompe l’elaborazione delle opzioni, e qualsiasi cosa dopo che è un argomento regolare.
http://www.gnu.org/software/hello/manual/libc/Using-Getopt.html#Using-Getopt
rm -- --somefile
Mentre funziona, è una soluzione che si basa su rm
utilizzando getopts per analizzare le sue opzioni. Ci sono applicazioni là fuori che fanno le loro analisi e vomiteranno anche su quello (perché potrebbero non necessariamente implementare la logica ” --
significa fine delle opzioni”).
Per questo motivo, la soluzione che dovresti guidare attraverso il tuo cranio è questa:
rm ./--somefile
Funzionerà sempre, perché in questo modo i tuoi argomenti non iniziano mai con un -
.
Inoltre, se stai cercando di creare script di shell davvero decenti; dovresti mettere tecnicamente ./
di fronte a tutte le espansioni dei parametri del tuo nome per impedire che gli script si rompano a causa dell’input funky del nome del file (o per impedire che vengano abusati / sfruttati per fare cose che non dovrebbero fare: per esempio, rm
cancellerà i file ma salterà le directory, mentre rm -rf *
cancellerà tutto. Passando un nome di file ” -rf
” a uno script o qualcuno touch ~victim/-rf
‘in questo modo potrebbe essere usato per cambiare il suo comportamento con conseguenze negative).
O rm -- --testings.html
o rm ./--testings.html
.
rm -- --testings.html
Un altro modo per farlo è usare find … -name “- *” -delete
touch -- --file find -x . -mindepth 1 -maxdepth 1 -name "--*" -delete
Per un approccio più generalizzato per l’eliminazione di file con caratteri impossibili nel nome file, un’opzione è quella di utilizzare l’inode del file.
Può essere ottenuto tramite ls -i
.
per esempio
$ 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 trovare:
$ find ./ -inum 452998712 -exec rm \{\} \;
Questo processo può essere utile quando si ha a che fare con molti file con le peculiarità dei nomi dei file, in quanto può essere facilmente copiato.
rm ./--testings.html
o
rm -- --testings.html