Unix: pliki zaczynające się od myślnika, -

19

Ok, mam kilka plików zaczynających się od myślnika, -. Co nie jest tak dobre ... i chcę je zmienić. W moim szczególnym przypadku chciałbym po prostu postawić przed nimi postać.

Znalazłem następujący wiersz, który powinien działać, ale z tego powodu myślnik nie działa:

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

Jeśli postawię echoprzed mv, dostanę kilka

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

Co jest poprawne, z tą różnicą, że pierwsza nazwa pliku to opcje. Więc kiedy usuwam echoi uruchamiam, po prostu dostaję kilka

mv: illegal option -- N

Próbowałem to zmienić na

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

ale wydaje się, że cytaty są po prostu ignorowane. Próbowałem użyć pojedynczych cudzysłowów, ale zmienna nie została rozwinięta ... Co mam tutaj zrobić?

Aktualizacja: próbowałem teraz zacytować cytaty. Lubię to:

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

A kiedy to powtarzam, wygląda to poprawnie, ale kiedy faktycznie go uruchamiam, po prostu dostaję

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

Nie mam pojęcia, jak to zrobić teraz ... westchnienie

Svish
źródło

Odpowiedzi:

28

Musisz użyć słowa kluczowego, --aby powiedzieć komendzie mv, że argumentów nie należy interpretować jako opcji. Zegarek:

$ 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

Użyj -- po wszystkich opcjach w linii poleceń. Na przykład, jeśli próbujesz użyć -iopcji mv , byłoby to wcześniej -- :

mv -i -- -filename-begins-with-dash newfilename
quack quixote
źródło
6
Aaa W ogóle o tym nie myślałem. W międzyczasie dowiedziałem się, że mogę też trzymać ./się nazwy pliku, co zadziała. Ale jest to oczywiście jeszcze
fajniejsza
@Svish: to sprawiedliwe, nie pomyślałem o dodaniu nazwy pliku do ./żadnego z nich. ale masz rację, to też działa w tej sytuacji.
quack quixote
7
Zauważ, że --znaczenie nie przetwarza dalszych argumentów, ponieważ opcje są konwencją i nie są przestrzegane przez wszystkie programy. Niektórzy używają do tego samotnych -, a niektórzy nie akceptują niczego w tym celu. ./Warto więc pamiętać o przygotowaniu.
dmckee,
@dmckee ma rację; --jako specjalny argument jest rozszerzeniem GNU, ale zostało wspomniane w wytycznych POSIX. patrz sekcja 12.2, wytyczna 10: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... oznacza to, że możesz oczekiwać, że większość narzędzi POSIX i GNU będzie przestrzegać konwencji, ale inne mogą tego nie robić .
quack quixote
6

Inną techniką jest dołączenie katalogu nadrzędnego do nazwy pliku ...

Aby zmienić nazwę pliku „-file-to-rename” na „file-to-rename” ...

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

Dziękuję @Skippy le Grand Gourou. Potwierdzono, że ./-plik- do-nazwa działa z mvi rmjak w ...

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

rm  ./-file-to-rename
DocSalvager
źródło
1
Lub lepiej, jak już wspomniano w komentarzach do quack quixote odpowiedzi, używając ./.
Skippy le Grand Gourou