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

У мене просто немає поняття, як це зробити зараз ... зітхніть


Відповіді:


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: це справедливо, я не замислювався над тим, щоб попередньо назвати ім'я файлу ./. але ви праві, це теж працює для цієї ситуації.
шарлатаний кіхот

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

1
Або ще краще, як уже згадувалося в коментарях, щоб перейняти відповідь кіхота, використовуючи ./.
Skippy le Grand Gourou
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.