Unix: Dateien, die mit einem Bindestrich beginnen, -

19

Ok, ich habe ein paar Dateien, die mit einem Bindestrich beginnen, -. Was nicht so gut ist ... und ich möchte sie umbenennen. In meinem speziellen Fall möchte ich nur eine Figur vor sie stellen.

Ich habe die folgende Zeile gefunden, die funktionieren sollte, aber aufgrund des Bindestrichs funktioniert sie nicht:

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

Wenn ich einen echodavor lege, mvbekomme ich einen Haufen

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

Welches ist richtig, außer natürlich wird es denken, dass der erste Dateiname Optionen ist. Also, wenn ich das entferne echound es laufen lasse, bekomme ich nur ein paar

mv: illegal option -- N

Ich habe versucht, es zu ändern

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

aber die Anführungszeichen werden einfach ignoriert, wie es scheint. Versuchte einfache Anführungszeichen zu verwenden, aber dann wurde die Variable nicht erweitert ... Was mache ich hier?

Update: Ich habe jetzt auch versucht die Zitate zu zitieren. So was:

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

Und wenn ich das wiederhole, sieht es richtig aus, aber wenn ich es tatsächlich ausführe, bekomme ich es einfach

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

Ich habe nur keine Ahnung, wie ich das jetzt machen soll ... seufz

Svish
quelle

Antworten:

28

Sie müssen das Schlüsselwort verwenden --, um dem Befehl mv mitzuteilen, dass die Argumente nicht als Optionen interpretiert werden sollen. Uhr:

$ 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

Verwenden Sie -- nach allen Optionen in der Befehlszeile. Zum Beispiel, wenn Sie die verwenden sind versuchen -iOption mv , würde es gehen vor -- :

mv -i -- -filename-begins-with-dash newfilename
Quacksalber
quelle
6
Aaah. Daran habe ich überhaupt nicht gedacht. In der Zwischenzeit fand ich heraus, dass ich auch ./vor dem Dateinamen bleiben könnte , was funktionieren würde. Aber dies ist natürlich eine noch schönere Option :)
Svish
@Svish: Das ist fair, ich habe auch nicht daran gedacht, dem Dateinamen ein vorangestelltes Wort zu geben ./. aber du hast recht, das funktioniert auch in dieser situation.
Quack Quijote
7
Beachten Sie, dass die --Bedeutung, keine weiteren Argumente als Optionen zu verarbeiten, eine Konvention ist und nicht von allen Programmen respektiert wird. Einige benutzen dafür einen Einzelgänger -und andere akzeptieren nichts für diesen Zweck. Es ./lohnt sich also, das Voranstellen im Hinterkopf zu behalten.
dmckee
@ dmckee ist richtig; --Als besonderes Argument dient eine GNU-Erweiterung, die jedoch in den POSIX-Richtlinien erwähnt wird. siehe Abschnitt 12.2, Richtlinie 10: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... dies bedeutet, dass Sie erwarten können, dass die meisten POSIX- und GNU-Dienstprogramme die Konvention einhalten, andere jedoch möglicherweise nicht.
Quack Quijote
6

Eine andere Technik besteht darin, das übergeordnete Verzeichnis mit dem Dateinamen einzuschließen ...

Um die Datei '-file-to-rename' in 'file-to-rename' umzubenennen ...

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

Vielen Dank, dass Sie @Skippy le Grand Gourou. Bestätigt, dass ./-file-to-rename mit mvund rmwie in ... funktioniert

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

rm  ./-file-to-rename
DocSalvager
quelle
1
Oder besser, wie bereits in Kommentaren erwähnt, um die Antwort von quixote mit quack zu beantworten ./.
Skippy le Grand Gourou