Копирование и перемещение файлов
Для перемещения файлов и каталогов предназначена утилита mv (сокращение от англ. «move» — «перемещать»). У mv два обязательных параметра: первый — перемещаемый файл или каталог, второй — файл или каталог назначения. Имена файлов и каталогов могут быть заданы в любом допустимом виде: при помощи полного или относительного пути. Кроме того, mv позволяет перемещать не только один файл или каталог, а сразу несколько. За подробностями о допустимых параметрах и ключах следует обратиться к руководству по mv .
[methody@localhost methody]$ mv -- -filename-with- examples/ [methody@localhost methody]$ cd examples [methody@localhost examples]$ mv ../text . [methody@localhost examples]$ ls -filename-with- text [methody@localhost examples]$
Пример 10. Перемещение файлов
Мефодий сначала переместил в каталог « examples » файл « -filename-with- », поскольку имя этого файла начинается с « — », ему потребовалось предварить его ключом « — », чтобы следующее слово было воспринято комадной оболочкой как параметр (этот приём был описан в лекции Терминал и командная строка). Затем он перешёл в каталог « examples » и переместил из родительского каталога (« ../ ») файл « text » в текущий каталог (« . »). Теперь в каталоге « examples » два файла с примерами.
Перемещение файла внутри одной файловой системы в действительности равнозначно его переименованию: данные самого файла при этом остаются на тех же секторах диска, изменяются каталоги, в которых произошло перемещение. Перемещение предполагает удаление ссылки на файл из того каталога, откуда он перемещён, и добавление ссылки на этот самый файл в тот каталог, куда он перемещён. В результате изменяется полное имя файла — полный путь, т. е. положение файла в файловой системе.
Иногда требуется создать копию файла: для большей сохранности данных, для того, чтобы создать модифицированную версию файла и т. п. В Linux для этого предназначена утилита cp (сокращение от англ. «copy» — «копировать»). Утилита cp требует присутствия двух обязательных параметров: первый — копируемый файл или каталог, второй — файл или каталог назначения. Как обычно, в именах файлов и каталогов можно использовать полные и относительные пути. Есть несколько возможностей при комбинации файлов и каталогов в параметрах cp — о них можно прочесть в руководстве.
[methody@localhost examples]$ cp text text.bak [methody@localhost examples]$ ls -filename-with- text text.bak
Пример 11. Копирование файлов
Мефодий решил создать резервную копию файла « text », « text.bak » в том же каталоге, что и исходный файл. Для этой простейшей операции копирования достаточно передать cp в качестве двух параметров имя исходного файла и имя копии. По умолчанию cp , как и многие другие утилиты, будет работать с файлами в текущем каталоге.
Нужно иметь в виду, что в Linux утилита cp нередко настроена таким образом, что при попытке скопировать файл поверх уже существующего не выводится никакого предупреждения. В этом случае файл будет просто перезаписан, а данные, которые содержались в старой версии файла, бесповоротно потеряны. Поэтому при использовании cp следует всегда быть внимательным и проверять имена файлов, которые нужно скопировать.
Говоря о копировании, уместно вспомнить широко известное высказывание, приписываемое Уильяму Оккаму: «Не следует умножать сущности сверх необходимого». Созданная при помощи cp копия файла связана с оригиналом только в воспоминаниях пользователя, в файловой системе исходный файл и его копия — две совершенно независимые и ничем не связанные единицы. Поэтому при наличии нескольких копий одного и того же файла в рамках одной файловой системы повышается вероятность запутаться в копиях или забыть о некоторых из них. Если задача состоит в том, чтобы обеспечить доступ к одному и тому же файлу из разных точек файловой системы, нужно использовать специально предназначенный для этого механизм файловой системы Linux — ссылки.
Как перемещать файлы и каталоги в Linux (команда mv)
Перемещение файлов и каталогов — одна из самых основных задач, которые вам часто приходится выполнять в системе Linux.
В этом руководстве мы объясним, как использовать команду mv для перемещения файлов и каталогов.
Как использовать команду mv
Команда mv (сокращение от move) используется для переименования и перемещения файлов и каталогов из одного места в другое. Синтаксис команды mv следующий:
mv [OPTIONS] SOURCE DESTINATION
SOURCE может быть одним или несколькими файлами или каталогами, а DESTINATION может быть одним файлом или каталогом.
- Когда в качестве SOURCE задано несколько файлов или каталогов, DESTINATION должен быть каталогом. В этом случае файлы SOURCE перемещаются в целевой каталог.
- Если вы укажете один файл как SOURCE , а целью DESTINATION является существующий каталог, то файл будет перемещен в указанный каталог.
- Если вы укажете один файл в качестве SOURCE и один файл в качестве цели DESTINATION вы переименуете файл .
- Если SOURCE является каталогом, а DESTINATION не существует, SOURCE будет переименован в DESTINATION . В противном случае, если DESTINATION существует, он будет перемещен в каталог DESTINATION .
Чтобы переместить файл или каталог, вам необходимо иметь права на запись как в SOURCE и в DESTINATION . В противном случае вы получите сообщение об ошибке в разрешении отказано.
Например, чтобы переместить файл file1 из текущего рабочего каталога в каталог /tmp вы должны запустить:
mv file1 /tmp
Чтобы переименовать файл, вам необходимо указать имя файла назначения:
mv file1 file2
Синтаксис перемещения каталогов такой же, как и при перемещении файлов. В следующем примере, если каталог dir2 существует, команда переместит dir1 внутрь dir2 . Если dir2 не существует, dir1 будет переименован в dir2 :
mv dir1 dir2
Перемещение нескольких файлов и каталогов
Чтобы переместить несколько файлов и каталогов, укажите файлы, которые вы хотите переместить, в качестве источника. Например, чтобы переместить файлы file1 и file2 в каталог dir1 , введите:
mv file1 file2 dir1
Команда mv также позволяет использовать сопоставление с образцом. Например, чтобы переместить все файлы pdf из текущего каталога в каталог ~/Documents , вы должны использовать:
mv *.pdf ~/Documents
Параметры команды mv
Команда mv принимает несколько параметров, которые влияют на поведение команды по умолчанию.
В некоторых дистрибутивах Linux mv может быть псевдонимом команды mv с настраиваемым набором параметров. Например, в CentOS mv — это псевдоним mv -i . Вы можете узнать, является ли mv псевдонимом, используя команду type :
type mv
Если mv является псевдонимом, вывод будет выглядеть примерно так:
mv is aliased to `mv -i'
Если указаны конфликтующие варианты, последний имеет приоритет.
Запрашивать перед перезаписью
По умолчанию, если целевой файл существует, он будет перезаписан. Чтобы запросить подтверждение, используйте параметр -i :
mv -i file1 /tmp
mv: overwrite '/tmp/file1'?
Чтобы перезаписать файл типа y или Y
Принудительная перезапись
Если вы попытаетесь перезаписать файл, доступный только для чтения, команда mv спросит вас, хотите ли вы перезаписать файл:
mv -i file1 /tmp
mv: replace '/tmp/file1', overriding mode 0400 (r--------)?
Чтобы не получать подсказки, используйте параметры -f :
mv -f file1 /tmp
Эта опция особенно полезна, когда вам нужно перезаписать несколько файлов, доступных только для чтения.
Не перезаписывать существующие файлы
Параметр -n указывает mv никогда не перезаписывать существующие файлы:
mv -f file1 /tmp
Если существует file1 приведенная выше команда ничего не сделает. В противном случае он переместит файл в каталог /tmp .
Резервное копирование файлов
Если целевой файл существует, вы можете создать его резервную копию, используя параметр -b :
mv -b file1 /tmp
Файл резервной копии будет иметь то же имя, что и исходный файл, с добавленной к нему тильдой ( ~ ).
Используйте команду ls, чтобы убедиться, что резервная копия была создана:
ls /tmp/file1*
/tmp/file1 /tmp/file1~
Подробный вывод
Другой вариант, который может быть полезен, — это -v . Когда используется эта опция, команда печатает имя каждого перемещенного файла:
mv -i file1 /tmp
renamed 'file1' -> '/tmp/file1'
Выводы
Команда mv используется для перемещения и переименования файлов и каталогов.
Для получения дополнительных сведений о команде mv страницу руководства или введите в терминале man mv .
Новые пользователи Linux, которых пугает командная строка, могут использовать файловый менеджер с графическим интерфейсом для перемещения своих файлов.
Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.
08. Перемещение, переименование, удаление. Жёсткие и символические ссылки
Осталось разобрать ещё пару операций – перемещение, переименование и удаление. В отличии от копирования, при перемещении в рамках одной файловой системы нам не нужно создавать копию данных, нам просто нужно изменить путь к этому файлу. Для этого не нужно затрагивать сами данные, достаточно просто создать жёсткую ссылку в новом месте и удалить в старом. За это отвечает команда move – mv. Синтаксис команды и ключи во многом сходятся с ключами команды copy (cp), та же интерактивность с ключом -i, тот же update и всё такое. Для примера, чтобы переместить файл в директорию, пишем:
mv -v file15 dir_a
Но, в отличии от copy, при перемещении директории не нужно указывать опцию рекурсивно (-r). То есть достаточно написать:
mv dir_a dira
Вы можете спросить, а почему mv для директорий не нужна рекурсия? Всё дело в том, что директория – это специальный файл, который можно представить в виде листа. А файлы внутри директории — это просто строчки на этом листе (жёсткие ссылки), в которых указано имя файла и номер иноды. Внутри директории (листа) есть список жёстких ссылок (файлов) и две специальные жёсткие ссылки – на себя и на директорию выше – точка и две точки соответственно. То есть перемещая директорию вы просто перемещаете лист, при этом вам не нужно ничего делать с файлами, указанными на листе. В отличии от копирования, когда вы создаёте новую директорию(лист), а также создаёте новые файлы и, соответственно, новые жёсткие ссылки.
Но всё вышесказанное работает в рамках одной файловой системы, так как жёсткие ссылки – это часть файловой системы. Они содержат номер иноды, а не данные. Поэтому перемещение из одной файловой системы в другую – это просто копирование данных с удалением того, что было. Хотя это делается той же командой mv.

Теперь про переименование. Помните, имя файла – это жёсткая ссылка, которая содержит собственно имя и номер иноды? Собственно, поменять имя – это создать жёсткую ссылку с новым именем и удалить со старым. Именно этим у нас занимается команда mv. То есть, если вы хотите переименовать файл или директорию, достаточно написать:
mv -v file1 newname mv -v dir_a dira

Что касается удаления, как думаете, с чем оно работает? Да, опять же, с жёсткими ссылками. Для удаления используется команда remove – rm. Например:
rm -v file2
Опции во многом совпадают с предыдущими командами – та же интерактивность с ключом -i, та же рекурсия, если мы удаляем целую директорию со всем содержимым.

Можем разом удалить несколько файлов и директорий:
rm -rv file1 file2 dir1 dir2
В общем, всё как при копировании. Ну или допустим, если хотим удалить всё в текущей директории:
rm -r *
Кстати, одна из самых «мемных» команд:
rm -rf /
удаляет всё в корне, включая все поддиректории, то есть все файлы в системе. Поэтому будьте внимательны, когда выполняете команды.

Помните, я говорил, что файл существует, пока есть хотя бы одна жёсткая ссылка на него? В прошлый раз мы создали жёсткую ссылку с помощью команды cp с ключом -l:
cp -vl filea filealink
Но обычно для создания жёстких ссылок используется команда link — ln. Синтаксис простой:
ln -v filea samefile
Но жёсткие ссылки работают только для файлов, а не директорий, так как жёсткая ссылка для директории может создать проблему в файловой системе. Жёсткие ссылки можно создавать и удалять, друг на друга они не влияют.
Жёсткие ссылки часто используются при бэкапе данных — когда у вас уже есть копия данных и изменились только некоторые файлы. Вместо того, чтобы копировать в новую директорию абсолютно всё, вы просто кладёте туда новые файлы и жёсткие ссылки на неизмененные файлы. Это позволяет здорово сэкономить место, так как жёсткие ссылки практически ничего не весят, в отличии от копии данных.

Кроме жёстких ссылок, существуют символические ссылки. На английском вместо symbolic link чаще говорят soft link, но на русском больше закрепилось выражение символические ссылки. Символические ссылки ссылаются не на иноду, а на жёсткую ссылку и создаются с помощью ln с ключом -s:
ln -vs filea softlink
Также символические ссылки работают с директориями:
ln -vs dir_c dirlink
Такой ссылке вообще плевать, есть файл или нет, удалили или не создали. Символическая ссылка может ссылаться на файл на других файловых системах.

Символические ссылки можно увидеть с помощью команды
ls -l
Эта команда даёт много информации, но сейчас нас интересует первый символ и последний столбик. Первый символ говорит о типе файла – если дефис, то это обычный файл, а правильнее — жёсткая ссылка, если d – это директория, если l – символическая ссылка. А в последнем столбике видны имена файлов и директорий. Рядом с символическими ссылками стоит символ, показывающий, на какой файл ссылается символическая ссылка. Если этого файла нет:
ln -vs nofile badlink
допустим, удалили – то ссылка всё ещё остаётся и становится «битой ссылкой». Ссылки – это тоже файлы, а значит удаляются простой командой:
rm -v softlink
Многие новички путают символические ссылки с ярлыками, но это разные вещи. Ярлык относится к графической оболочке, ему можно поставить описание, иконку, а также прописать какую-то команду запуска, чем активно пользуются всякие вирусы. Вы, возможно, сталкивались – вставили флешку в чужой компьютер, а там все содержимое превратилось в ярлыки. И люди ведутся на обман – щёлкают по ярлыкам. А в этих ярлыках, как правило, содержится команда для запуска какого-нибудь скрытого вируса, который прописывает себя в планировщик задач.

Символические ссылки больше относятся к файловой системе. А путают их, потому что применение примерно одинаковое – допустим, вам нужен простой путь к какой-то директории или файлу, допустим, хотите видеть в домашней директории какую-нибудь другую директорию:
ln -s /usr/share/applications .
Или, допустим, какая-то программа всегда работает с определённой директорией, а вам это нужно поменять, например, выложить эту директорию на сервер. Это, конечно, зачастую можно сделать и в настройках программ, но ситуации бывают разные.
И так, мы рассмотрели, как создавать, копировать, перемещать, удалять файлы и директории, а также разобрали жёсткие и символические ссылки. Многое из этого, хотя и не всё, можно делать и через графический интерфейс, но когда речь идёт о серверах, ставить на них графический интерфейс не стоит – это пустая трата ресурсов и, теоретически, новые уязвимости. Эти команды довольно простые, если вы будете практиковаться, то многие эти операции вам проще будет сделать через командную строку даже при наличии графического интерфейса.
© Copyright 2021, GNU Linux Pro, CC-BY-SA-4.0. Ревизия 5f665cc2 .
Перемещение нескольких файлов
Перемещение, как и копирование, может производиться сразу над несколькими файлами, поскольку в команде mv допустимо наличие более двух аргументов. В этом случае последний аргумент указывает каталог назначения (перемещать, как и копировать, несколько файлов в один нельзя). Рассмотрим ситуацию, в которой необходимо переместить в каталог /tmp все файлы текущего каталога с расширениями .bak, .tmp и .old. Воспользуемся командой
$ mv *.bak *.tmp *.old /tmp
По этой простой команде все файлы текущего каталога с расширениями . bak, .tmp и .old будут перемещены в каталог / tmp.
Командой mv можно перемещать целые каталоги, причем для этого не надо устанавливать флажки. Если в текущем каталоге есть подкаталог TheDir, который надо переместить в каталог / tmp, введите команду
$ mv TheDir//tmp
Аналогично, каталог TheDir превращается в подкаталог каталога NewDir:
$ mv TheDir/ /NewDir
Как и для двух команд, рассмотренных выше, для команды mv необходимо установить алиас mv -i, чтобы предотвратить случайную запись перемещаемых файлов поверх уже .существующих. Для этого введите команду $ alias mv=’mv -i’. В учетной записи суперпользователя такой алиас для команд ер, rm и mv установлен по умолчанию.