Рейтинг:8

ошибка при попытке mv файла с -r в имени файла

флаг in

Вот моя проблема:

У меня есть файл с -r в имени: -r.jpg

Когда я попытался сделать мв *.jpg старый/ Я получил:

mv: недопустимая опция -- 'r'

Даже для

для g в *.jpg; выполнить echo $g &&mv "${g}" old/;done

У меня такая же ошибка.

paladin avatar
флаг id
Использование `mv -- *.jpg old/`, `--` отключает все дополнительные "параметры" после `--`.
флаг pl
Хорошо, что вы не пытались `rm` файл, содержащий `-rf`...
Рейтинг:16
флаг kz

Большинство утилит командной строки имеют возможность разделять параметры от аргументы.

Это предотвращает множество проблем с "специальный" имена файлов, которые выглядят как параметры.

Наиболее распространенным разделителем, обозначающим конец опций, является два дефиса. -- или же -- который также поддерживается мв.

Другими словами:

 mv [ОПЦИИ] -- ИСТОЧНИК ЦЕЛЕВОЙ

или поскольку вы не указали никаких параметров:

 мв -- *.jpg старый/
Рейтинг:2
флаг cn

Самым простым решением было бы добавить перед именем файла ./ описание относительного пути

для г в *.jpg; do echo $g && mv "./${g}" old/; сделано

Также можно использовать абсолютный путь

для g в $(pwd)/*.jpg; сделать echo $g && mv $g old/; сделано

В качестве альтернативы вы можете использовать найти команда, так как она уже предоставляет относительный путь (вы можете использовать --Максимальная глубина если вы хотите обрабатывать только текущий каталог)

для g в $(найти .-имя "*jpg"); сделать mv $g старым; сделано

И в худшем случае, когда у вас есть много сложных символов, которые невозможно разобрать, вы можете обратиться к номерам инодов в сочетании с найти -inum и обработайте ваши файлы соответствующим образом

 $ для g in $(ls -i1 ./*jpg | cut -f1 -d' '); найти . -inum $g -print0 | xargs -0 -I '{}' mv '{}' старый; сделано
флаг in
использование "./" - умный совет; и inum намекает на очень хорошее решение :)
iBug avatar
флаг um
Буквально нет «неразборчивых» символов: все, что вам нужно сделать, это правильно заключить переменные в кавычки. В большинстве случаев достаточно пары двойных кавычек.
Peter Cordes avatar
флаг ke
`mv ./*.jpg old/` будет работать; вам не нужно зацикливать один файл за раз.
Peter Cordes avatar
флаг ke
@Bussiere: хак `find -inum` не особенно полезен, если вы не хотите найти жесткие ссылки. `найти . -maxdepth 1 -name '*.jpg' -print0 | xargs -0 mv -t old/` или что-то в этом роде сделает то же самое и в конечном итоге запустит `mv -t old ./-r.jpg`, как эта команда. (Возможно, с несколькими другими именами файлов в одной командной строке). Это просто тратит много времени на запуск `find` для сканирования всего поддерева на наличие файлов с этим номером инода для каждого входного файла, а затем на печать имени файла. Он *не* запускает `mv` для номера инода; Системные вызовы Unix не могут этого сделать.
Peter Cordes avatar
флаг ke
@Bussiere: Ключевая вещь, которая заставляет его работать (`./*.jpg` вместо `*.jpg`), уже используется в командной строке `ls`, чтобы избежать запуска `ls -r.jpg`, остальное только зря потраченные усилия. Я не могу представить себе случай, когда find ищет номер инода лучше, чем просто используя собственное совпадение имени файла, например `-iname` или `-path`, и в идеале используя `-exec mv -t old/ {} +` чтобы даже не нуждаться в xargs.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.