Почему mv удалил файл с mv id_rsa * .old? [дубликат]

Нет.

del_mtd_parttions вызывается только во время очистки. Не существует пути, где он вызывается перед повторным добавлением различных разделов.

8
14.03.2016, 03:52
2 ответа

Он был переименован в known_hosts.old , следовательно, было перезаписано предыдущее содержимое known_hosts.old .

Поскольку у вас уже есть файл с именем known_hosts.old , шаблон glob *. Old был расширен до known_hosts.old .

Вкратце, следующее:

mv id_rsa *.old

было расширено до:

mv id_rsa known_hosts.old

В bash , если бы там не было файла с именем known_hosts.old , он бы расширить до литерала *. old (если вы не включили nullglob ).

32
27.01.2020, 20:08

Похоже, вы думали, что mv id_rsa * .old переместит id_rsa в id_rsa.old с заменой * по первому аргументу, но это не так. Подстановочные знаки расширяются оболочкой, а не командой. К тому времени, когда mv увидит команду, оболочка расширила подстановочный знак. Возможны четыре случая:

  • Шаблон подстановочного знака не соответствует ни одному файлу. В большинстве оболочек это оставляет шаблон подстановки нерасширенным, и поэтому mv вызывается с аргументами id_rsa и *. Old . Затем он перемещает id_rsa в файл с именем *. Old (звездочка является первым символом имени файла). Некоторые оболочки (в зависимости от их конфигурации) вместо этого будут отображать ошибку и не запускать команду в этом случае.
  • Шаблон подстановочного знака соответствует ровно одному файлу, который не является каталогом. В этом случае оболочка заменяет шаблон именем соответствующего файла. Таким образом, mv перемещает id_rsa в этот совпадающий файл, перезаписывая предыдущий файл. Вот что произошло в вашем случае: mv был вызван с аргументами id_rsa и known_hosts.old , чтобы known_hosts.old были перезаписаны .
  • Шаблон подстановочного знака соответствует двум или более файлам, а последний (в лексикографическом порядке) не является каталогом.В этом случае mv жалуется, потому что все файлы, кроме последнего, являются исходными, и нет смысла перемещать несколько файлов в один и тот же файл.
  • Шаблон подстановочного знака соответствует одному или нескольким файлам, а последнее совпадение (в лексикографическом порядке) - это каталог. Исходный файл перемещается в этот каталог. Если файл с таким же именем уже существует, он перезаписывается. Если шаблон имеет более одного совпадения, это также относится ко всем файлам, соответствующим шаблону, кроме последнего, поскольку mv видит их как исходные файлы.

Чтобы избежать неожиданной перезаписи целевых файлов mv , запросите подтверждение. Поместите это в инициализацию вашей оболочки (например, .bashrc ):

alias cp='cp -i'
alias mv='mv -i'

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

mv id_rsa{,.old}

Оболочка расширяет это до mv с аргументами id_rsa ( id_rsa , объединенными с пустой строкой) и id_rsa.old ( id_rsa конкатенирован с .old ).

Для массового переименования файлов в соответствии с шаблонами наиболее часто используются инструменты zmv (только zsh), prename и mmv . Чтобы переименовать все файлы формы с id_ SOMETHING на id_ SOMETHING .старый , вы можете использовать

zmv 'id_*' '$f.old'
mmv 'id_*' 'id_#1.old'
prename 's/$//' id_*
19
27.01.2020, 20:08

Теги

Похожие вопросы