Come posso eliminare un file il cui nome inizia con “-” (trattino aka trattino o meno)?


349

Come si rimuove un file il cui nome inizia con un trattino (trattino o meno) -? Sono entrato in un server OSX remoto e ho questo file nella mia directory:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...

Come posso cancellare --helpda una CLI? Questo problema è qualcosa che ho riscontrato in diverse forme in alcune occasioni, questi file sono facili da creare, ma difficili da eliminare.

Ho provato a usare la barra rovesciata

rm \-\-help

Ho provato le citazioni

rm "--help"

Come posso impedire che il carattere meno (trattino o trattino) sia interpretato come un'opzione?


1
Sarebbe bello se questa domanda fosse rinominata in "Come eliminare un file il cui nome inizia con -".
Sandy

@Sandy Agreed; Di solito non mi piace cambiare il significato di una domanda, ma in questo caso la risposta accettata è specifica per questo problema
Michael Mrozek

33
lo trovo un po 'ironico che in rm --helprealtà spiega come eliminare i nomi di file che iniziano con a -. buona domanda comunque.
lesmana,

1
@ jw013 A volte l'aiuto è facile da capire per gli utenti esperti, ma travolgente e confuso per i neofiti.
iconoclasta,

1
Mi sono imbattuto in questo su un sistema usando rm da BusyBox. Tutto è minimo, incluso l'aiuto, quindi rm --help non ha fornito alcun indizio.
dslake,

Risposte:


497

Utilizzare "-" per impedire a rm di analizzare le opzioni della riga di comando, in questo modo:

rm -- --help

1
Sapevo che era qualcosa di molto semplice come questo ...
Bryan Rehbein,

2
Tutte le versioni del rmcomando supportano l' --argomento?
Keith Thompson il

3
@KeithThompson - è una funzionalità della maggior parte degli strumenti GNU, quindi non funzionerà sulla maggior parte degli Unix non GNU ("non Linux") (es. Varianti BSD o alcuni sistemi embedded)
dtech

1
GRAZIE! Mi ha salvato la giornata. E ovviamente funziona su BSD (OSX) e con altri comandi!
Raskhadafi,

8
@dtech, getopt () e --precedenti GNU (SysIII, 1980) e sono standard / POSIX. Le utility standard, tranne alcune eccezioni (come echo), comprendono --. YMMV per altri comandi se non utilizzano l'API getopt () per analizzare le opzioni.
Stéphane Chazelas,

214

Oppure puoi farlo

rm ./--help

7
Non è importante, ma questo sembra il più "corretto".
James M.

2
Questo è quello che ricordo. L'uso di "rm - --help" è qualcosa che devo sempre cercare.
user603

25
Questo metodo funziona sempre anche per i comandi che non trattano in modo --speciale.
jw013,

E funziona anche per evitare un trattamento speciale da parte di alcuni comandi per altri tipi (accanto opzioni) di argomenti specificamente denominati come il -di utility testo o cd, il foo=bardi awk...
Stéphane Chazelas

1
Funziona quando un file inizia con un singolo trattino, dove rm -- <filename>invece no.
StockB

37

Usa findper farlo:

find . -name '--help' -delete

E questo è un buon metodo perché se hai più di alcuni file come questo che puoi eliminare puoi ottenere un elenco di anteprima dei file semplicemente eseguendo -deleteprima senza l' opzione di ricerca, quindi se l'elenco dei file sembra buono basta eseguire di nuovo con -delete.

In effetti, evitare rmin favore di find(soprattutto con l'anteprima prima) è una buona abitudine che ti aiuterà a evitare errori con rm *che ti morderà inevitabilmente un giorno.

Nota, tuttavia, che find verrà richiamato attraverso tutte le tue sottodirectory, quindi potresti volerlo eseguire con un vincolo di profondità della sottodirectory come questo:

find . -maxdepth 1 -name '--help' -delete

che limita la ricerca alla directory corrente.


Portabilmente, è necessario fornire findun elenco di file / directory da esaminare. Così find . -name.... -deletee -maxdepthnon sono neanche opzioni standard.
Stéphane Chazelas,

21

Le risposte di Vegar Nilsen ed edfuh sono molto buone e le soluzioni adeguate a un problema come questo.

Voglio aggiungere una risposta generale a questa domanda che ti consente di eliminare qualsiasi file con un nome file difficile. Prima si ottiene il suo numero di inode usando ls -io in qualche modo state poi il file viene rimosso cercando i file nella directory corrente per numero di inode ed eseguendo il rmcomando sul file con un numero di inode corrispondente

find . -inode <inode> -exec rm {}\;

Poiché i numeri di inode sono univoci in ciascun file system, è possibile rimuovere qualsiasi file usando questo; Unicode o usando i caratteri di escape. È quanto mai fastidioso digitare, quindi consiglierei di aggiungere la riga

TAB: menu-complete             # Tab: Cycles through the command
"\e[Z": menu-complete-backward # Shift-Tab: Cycles backwards

nel tuo .inputrcfile se stai usando bash. Ciò consente di scorrere l'elenco dei possibili completamenti ( per ulteriori informazioni ).


5
In questo modo ha due problemi: 1) non usare -exec rm quando è possibile usare -delete; 2) ottenere l'inode e usarlo è inutilmente complicato quando puoi semplicemente usare:find -name '--help' -delete
aculich

Non penso che funzionerà. Attraversa tutti i file nella directory corrente e tutte le sue sottodirectory, e dopo tutto ciò che invoca ancorarm --help , che comunque non rimuoverà il file. Basta usare rm ./--help(o rm -i *.
Keith Thompson il

1
@KeithThompson antepone findil percorso dell'argomento della riga di comando a tutti i file, quindi verrà eseguito rm ./--helpe rm ./sub/dirs/--help. Per risolvere il secondo, bisognerebbe aggiungere -maxdepth 1, ma tutto questo essenzialmente sta applicando la soluzione di @ edfuh in un modo più rotatorio, contorto ed -deleteè più sicuro che -exec rmcomunque.
jw013,

1
Un altro problema con questo comando è che ci deve essere uno spazio tra {}e \;, altrimenti non funzionerà.
Eugene S,

gli inode possono essere univoci ma potrebbero esserci più voci di directory con lo stesso inode. Questi sono chiamati hardlink. E sono unici per file system, quindi è necessario utilizzarli -xdev. Questo non ti aiuterà a eseguirlo ls -i --help.
Stéphane Chazelas,

11

Una soluzione brutale:

perl -e "unlink '--help' or die 'Could not unlink.';"

perl -e "rmdir '-d' or die 'Could not rmdir.';"

8

Procedura dettagliata di Linux per creare un file con trattini e spazi, quindi rimuoverlo.

STAI ATTENTO! Non eseguire accidentalmente un rm -rf /comando di eliminazione in cascata simile o simile.

Se il file che si sta tentando di rimuovere comprende asterischi o tagli, non pompare accidentalmente una .o /*o *o qualche altro carattere jolly che potrebbe collegare in cascata eliminare il sistema operativo.

Crea un file chiamato "--yo yo"

eric@dev ~ $ touch -- "--yo yo"
eric@dev ~ $ ls
bin  --yo yo

Innanzitutto, trovalo con trova:

eric@dev ~ $ find . -name "*--yo yo*"
./--yo yo

Assicurarsi che il comando find trovi SOLO il file ONE che si desidera eliminare:

Quindi passare l'opzione -delete per trovare, per eliminarli:

eric@dev ~ $ find . -name "*--yo yo*" -delete
eric@dev ~ $ ls
bin  

Aaaannd non c'è più.


2

Midnight Commander ( mc) è il più semplice, basta puntarlo e premere F8;)


3
L'OP vuole una soluzione a riga di comando (CLI).
Francesco Turco,

1
Midnight Commander È una soluzione CLI. Usa il tuo gestore di pacchetti per installarlo. (Funziona anche su ssh ...) en.wikipedia.org/wiki/Midnight_Commander
daviewales

6
In che modo i apt-get install mc || yum install mc; mc vari tasti freccia e F8 sono più facili di rm ./--help?
Josh,

3
@daviewales: Midnight Commander viene avviato dalla riga di comando e viene eseguito nel terminale, ma tutte le azioni della tastiera all'interno di Midnight Commander non provengono dalla CLI (Command Line Interface), ma provengono dall'interfaccia di Midnight Commander. - In genere, utilità della riga di comando può essere eseguito in uno script (un'eccezione è storia a riga di comando bash)
Peter.O

1

ecco una soluzione che avevo usato prima di trovare questa discussione.
usa vimper 'modificare' la directory:

vim .

quindi (in vim) seleziona il tuo file, premi dele e conferma la cancellazione.
quando hai finito smetti di usare vim:q


0

Hai provato ad aggiungere il nome della directory come prefisso:

$ rm ./-filename.txt dirname/-filename2.txt
$ mv ./-filename.txt filename.txt
$ cp teste ./-teste

L'uso della directory come prefisso del file in generale aiuta a evitare l'interpretazione errata del carattere "meno" come opzione di comando da parte della funzione parser.


1
Credo che questo fosse già stato trattato in una risposta precedente .
Kusalananda

-3

Se vuoi rinominare il file, -.bar(mv non funzionerà), prova questo:

cat >foo.bar <-.bar

prima di usare il comando:

rm -- -.bar

Dovresti essere in grado di esaminare il contenuto del file originale in foo.bar


4
Fare una copia del file non è una soluzione molto efficiente per rinominarlo.
jw013,

1
Potresti usare vidir; ma questo è probabilmente altrettanto (o anche più) inefficiente - e molto più pericoloso.
Stephen Menasian,
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.