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

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

2 ответа2

26

Вам нужно использовать ключевое слово -- чтобы сообщить команде 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

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

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

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

Спасибо @ Скиппи Ле Гран Гуру. Подтвердил, что ./-file-to-rename работает с mv и rm как в ...

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

rm  ./-file-to-rename

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .