Unix: file che iniziano con un trattino, -


19

Ok, ho un sacco di file che iniziano con un trattino, -. Il che non è così buono ... e voglio rinominarli. Nel mio caso particolare vorrei solo mettere un personaggio davanti a loro.

Ho trovato la seguente riga che dovrebbe funzionare, ma a causa del trattino non funziona:

for file in -N*.ext; do mv $file x$file; done

Se ne metto un echodavanti, mvne ottengo un mucchio

mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext

Il che è corretto, tranne ovviamente penserà che il primo nome file sia opzioni. Quindi quando rimuovo echoed eseguo ottengo un sacco di

mv: illegal option -- N

Ho provato a cambiarlo in

for file in -N*.ext; do mv "$file" "x$file"; done

ma sembra che le virgolette vengano semplicemente ignorate. Ho provato a usare virgolette singole, ma poi la variabile non è stata espansa ... Cosa devo fare qui?

Aggiornamento: ora ho anche provato a citare le virgolette. Come questo:

for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done

E quando lo faccio eco, sembra corretto, ma quando lo eseguo effettivamente ottengo

mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory

Non ho idea di come farlo ora ... sospiro


Risposte:


28

Devi usare la parola chiave --per dire al comando mv che gli argomenti non devono essere interpretati come opzioni. Orologio:

$ mv -N1.ext x-f1.ext
mv: invalid option -- N
Try `mv --help' for more information.

$ mv -- -N1.ext x-f1.ext
$ ls
x-f1.ext

Utilizzare -- dopo tutte le opzioni sulla riga di comando. Ad esempio, se stai cercando di utilizzare l' -iopzione per mv , andrebbe prima -- :

mv -i -- -filename-begins-with-dash newfilename

6
Aaah. Non ci ho pensato affatto. Nel frattempo ho scoperto che potevo rimanere anche ./davanti al nome del file, che avrebbe funzionato. Ma questa è ovviamente un'opzione ancora più bella :)
Svish

@Svish: è giusto, non ho pensato di anteporre il nome del file con ./nessuno dei due. ma hai ragione, funziona anche per questa situazione.
Quack Quixote

7
Si noti che il --significato non elabora ulteriori argomenti poiché le opzioni sono una convenzione e non sono rispettate da tutti i programmi. Alcuni usano un solitario -per quello, e altri non accettano nulla per quello scopo. Quindi ./vale la pena tenere a mente le anteprime .
dmckee,

@dmckee ha ragione; --come argomento speciale è un'estensione GNU, ma è menzionata nelle linee guida POSIX. vedere la sezione 12.2, linea guida 10: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... questo significa che ci si può aspettare che la maggior parte delle utility POSIX e GNU rispettino la convenzione, ma altre no.
Quack Quixote

6

Un'altra tecnica è quella di includere la directory principale con il nome del file ...

Per rinominare il file '-file-to-rename' in 'file-to-rename' ...

mv  ../parent-dir/-file-to-rename  file-to-rename

Grazie @Skippy le Grand Gourou. Confermato che ./-file-to-rename funziona con mve rmcome in ...

mv  ./-file-to-rename  ./--file-to-rename

rm  ./-file-to-rename

1
O meglio, come già accennato nei commenti per quackare la risposta di Quixote, usando ./.
Skippy le Grand Gourou,
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.