cat: ошибка записи: недопустимый аргумент

Похоже, вы думали, что 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_*

4
28.03.2019, 03:16
1 ответ

В ядре каждый драйвер предоставляет ряд методов для различных операций, которые могут быть выполнены над файлом: open, close, read, write, seek, ioctl и т.д. Эти методы хранятся в struct file_operations. Для устройств методы предоставляются драйвером, зарегистрировавшим конкретное устройство (т.е. конкретную комбинацию блока/заряда, главного номера и малого номера).

Драйвер может реализовать только некоторые из методов; предоставляются значения по умолчанию. Стандартные значения обычно ничего не делают и возвращают либо success (если для данного метода разумно ничего не делать), либо EINVAL (если нет разумного значения по умолчанию, а отсутствие метода означает, что функция не поддерживается).

"Ошибка записи: Недопустимый аргумент" означает, что метод write драйвера возвращает EINVAL. Наиболее вероятным объяснением является то, что у этого драйвера вообще нет метода write. Это довольно обычная ситуация, когда драйверы не поддерживают определенные действия, например, некоторые драйверы поддерживают только ioctl, но не чтение/запись, некоторые драйверы по своей сути однонаправленные (например, устройство ввода) и поддерживают только чтение, но не запись или наоборот.

"Неверный аргумент" не имеет никакого отношения к разрешениям, это то, что устройство может делать. Вы получите ошибку разрешения, если у вас нет разрешения на запись, но у вас есть разрешение на общение с драйвером. Просто вы просите драйвер сделать то, о чем он не имеет представления.

12
27.01.2020, 20:48

Теги

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