Unix: файлы, начинающиеся с тире, -

19

Хорошо, у меня есть куча файлов, начинающихся с тире, -. Что не очень хорошо ... и я хочу их переименовать. В моем конкретном случае я просто хотел бы поставить перед ними характер.

Я нашел следующую строку, которая должна работать, но из-за этого не работает:

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

Если я поставлю echoперед собой, mvя получу кучу

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

Что правильно, за исключением, конечно, будет думать, что первое имя файла - это параметры. Поэтому, когда я удаляю echoи запускаю его, я просто получаю кучу

mv: illegal option -- N

Я пытался изменить его на

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

но цитаты просто игнорируются, кажется. Пытался использовать одинарные кавычки, но тогда переменная не раскрывалась ... Что мне здесь делать?

Обновление: я также попытался процитировать цитаты. Как это:

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

И когда я повторяю это, это выглядит правильно, но когда я на самом деле запускаю это, я просто получаю

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

Я просто понятия не имею, как это сделать сейчас ... вздох

Svish
источник

Ответы:

28

Вам нужно использовать ключевое слово, --чтобы сообщить команде mv, что аргументы не должны интерпретироваться как опции. Часы:

$ 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

Используйте -- после всех параметров в командной строке. Например, если вы пытаетесь использовать -iопцию для mv , она будет идти раньше -- :

mv -i -- -filename-begins-with-dash newfilename
шарлатан
источник
6
Ааа. Даже не думал об этом. В то же время я узнал, что я мог бы придерживаться ./имени файла, что будет работать. Но это, конечно, еще более аккуратный вариант :)
Svish
@Svish: это справедливо, я даже не думал о добавлении имени файла ./. но вы правы, это тоже подходит для этой ситуации.
Квик-кихот
7
Обратите внимание, что --значение не обрабатывает дальнейшие аргументы, так как параметры являются соглашением и не соблюдаются всеми программами. Некоторые используют одиночество -для этого, а некоторые не принимают ничего для этой цели. Поэтому ./стоит помнить о предварительном подходе .
dmckee
@dmckee прав; --в качестве специального аргумента используется расширение GNU, но оно упоминается в рекомендациях POSIX. см. раздел 12.2, рекомендация 10: opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html ... это означает, что вы можете ожидать, что большинство утилит POSIX и GNU будут соблюдать соглашение, а другие - нет.
Квик-кихот
6

Другой способ - включить родительский каталог с именем файла ...

Чтобы переименовать файл '-file-to-rename' в 'file-to-rename' ...

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

Спасибо @Skippy le Grand Gourou. Подтвердил, что ./-file-to-rename работает с mvи rmкак в ...

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

rm  ./-file-to-rename
DocSalvager
источник
1
Или лучше, как уже упоминалось в комментариях к шарлатанскому ответу Кихота, используя ./.
Скиппи ле Гран Гуру