it-swarm.it

Come posso eliminare un file il cui nome inizia con "-" (trattino a.k.a. trattino o meno)?

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
...

In che modo posso eliminare --help da una CLI? Questo problema è qualcosa che mi capita di incontrare in diverse forme a volte, 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) venga interpretato come un'opzione?

377
Bryan Rehbein

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

rm -- --help
559
Vegar Nilsen

Oppure puoi farlo

rm ./--help
236
edfuh

Usa find per 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 find senza il -delete opzione prima, quindi se l'elenco dei file sembra buono basta eseguirlo nuovamente con -delete.

In effetti, evitare rm a favore di find (specialmente 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 voler eseguirlo con un vincolo di profondità della sottodirectory come questo:

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

che limita la ricerca alla directory corrente.

41
aculich

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 consente di eliminare qualsiasi file con un nome file difficile. Innanzitutto si ottiene il suo numero di inode usando ls -i o una qualche forma di stat e quindi il file viene rimosso cercando i file nella directory corrente per numero di inode ed eseguendo il comando rm 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 .inputrc file se stai usando bash. Ciò consente di scorrere l'elenco dei possibili completamenti ( per ulteriori informazioni ).

21
Baldur

Una soluzione brutale:

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

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

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

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

Se il file che stai tentando di rimuovere include asterischi o barre, non pompare accidentalmente un . o /* o * o qualche altro carattere jolly che potrebbe eliminare in cascata il tuo sistema operativo.

Crea un file chiamato "--yo yo"

[email protected] ~ $ touch -- "--yo yo"
[email protected] ~ $ ls
bin  --yo yo

Per prima cosa, trovalo con find:

[email protected] ~ $ 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:

[email protected] ~ $ find . -name "*--yo yo*" -delete
[email protected] ~ $ ls
bin  

Aaaannd non c'è più.

8
Eric Leschinski

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

2
Marcin

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

vim .

quindi (in vim) seleziona il tuo file, premi dele e conferma l'eliminazione.
al termine, esci da vim con :q

1
atti

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.