Копирование файла производится командой linux. Копирование, перемещение, создание и удаление файлов и каталогов

16.04.2019
cp [-R [-H | -L | -P]] [-f | -i | -n] [-lpv] исходный_файл целевой_файл cp [-R [-H | -L | -P]] [-f | -i | -n] [-lpv] исходный_файл целевой_каталог В первой форме утилита cp , копирует содержимое файла исходный_файл в целевой_файл . Во второй форме содержимое каждого указанного файла копируется в целевой_каталог . Имена самих файлов при этом не изменяются. Если cp обнаруживает попытку копирования файла самого в себя, копирование не производится.

Возможно использование следующих опций: -H Если указана опция -R , следовать по символическим ссылкам, указанным в командной строке, но не следовать по символическим ссылкам, встречающимся в процессе обхода дерева каталогов. -L Если указана опция -R , следовать всем символическим ссылкам. -P Если указана опция -R , не следовать никаким символическим ссылкам. Это режим работы cp по умолчанию. -R Если аргумент исходный_файл указывает на каталог, cp копирует этот каталог вместе со всем деревом файловой иерархии, которое он содержит. Если исходный_файл оканчивается на / , копируется не сам каталог, а только его содержимое. Эта опция также указывает на необходимость копирования символических ссылок, а не объектов, на которые они указывают, и заставляет cp создавать специальные файлы вместо того, чтобы копировать их, как обычные. Создаваемые каталоги имеют те же права доступа, что и исходные каталоги, вне зависимости от действующего для процесса значения umask . Обратите внимание, что cp копирует жёсткие ссылки как отдельные файлы. Если вам нужно сохранять жёсткие ссылки, используйте tar(1) , cpio(1) или pax(1) . -f Для каждого уже существующего целевого имени пути, удалять его и создавать новый файл, не требуя подтверждения операции, вне зависимости от его прав доступа. (Опция -f отменяет действие любой из ранее указанных опций -i или -n ). -i Если в результате копирования будет перезаписан существующий файл, cp запросит подтверждение пользователя. Если ответ, полученный со стандартного ввода, начинается символом "y " или "Y ", будет предпринята попытка копирования (опция -i отменяет действие любой из ранее заданных опций -f или -n ) -l Создавать жёсткие ссылки на обычные файлы в иерархии вместо того, чтобы их копировать. -n Не перезаписывать существующие файлы. (Опция -n отменяет действие любой из предшествующих опций -f или -i ). -p Заставляет cp сохранять следующие атрибуты каждого исходного файла в создаваемой копии: время модификации, время доступа, флаги файла, режим доступа, идентификаторы пользователя и группы, насколько это позволено правами доступа. Если значения идентификаторов пользователя и группы не могут быть сохранены, не выводится никакого сообщения об ошибке, и возвращаемое программой значение статуса завершения не изменяется. Если исходный файл имеет установленный SUID бит и значение идентификатора пользователя не может быть сохранено, SUID бит в атрибутах скопированного файла не сохраняется. Если исходный файл имеет установленный бит SGID и значение идентификатора группы не может быть сохранено, бит SGID в атрибутах копии не сохраняется. Если исходный файл имеет установленные биты SUID и SGID и значение либо идентификатора пользователя, либо идентификатора группы не может быть сохранено, ни один из битов SUID и SGID в атрибутах копии не сохраняется. -v Выводить больше информации, показывая файлы по мере их копирования.

Для каждого уже существующего целевого файла, его содержимое перезаписывается, если позволяют права доступа. Его режим доступа и идентификаторы пользователя и группы не изменяются, если не задана опция -p .

Во второй синтаксической форме целевой_каталог должен существовать, если только не был указан единственный исходный_файл , являющийся каталогом, и опция -R .

Если целевой файл не существует, используются права доступа исходного файла, изменённые в соответствии со значением umask (см. csh(1) ). Если исходный файл имеет установленный бит SUID, этот бит сбрасывается, если только исходный файл и файл назначения не принадлежат одному владельцу. Если исходный файл имеет установленный бит set-user-ID, этот бит сбрасывается, если только исходный файл и файл назначения не принадлежат одной группе, а пользователь является членом этой группы. Если установлены оба бита, и SUID, и SGID, должны быть соблюдены оба вышеупомянутых условия, в противном случае оба этих бита сбрасываются.

Для создания или перезаписи файлов требуются соответствующие права доступа.

Программа cp всегда следует символическим ссылкам, если только не указана опция -R (в этом случае она по умолчанию символическим ссылкам не следует). Опции -H или -L (совместно с опцией -R ) приводят к тому, что cp будет следовать символическим ссылкам, как описано выше. Опции -H , -L и -P игнорируются, если не указана опция -R . Кроме этого, эти опции отменяют друг друга, и действия команды определяются той опцией, которая была указана последней.

Если cp получает сигнал SIGINFO (см. аргумент status для stty(1) ), на стандартный вывод будут выведены имена текущего исходного и целевого файлов, а также прогресс копирования в процентах.

СТАТУС ЗАВЕРШЕНИЯ

Программа cp возвращает 0 в случае успешного завершения и >0 в случае возникновения ошибки.

СОВМЕСТИМОСТЬ

Старые версии cp имели опцию -r . Данная реализация поддерживает эту опцию, однако её поведение отличается от исторического. Использование этой опции настоятельно не рекомендуется, так как её поведение зависит от конкретной реализации. В , -r является синонимом для -RL и работает так же, если это не переопределено другими флагами. Реализация -r в старых версиях отличалась тем, что при воссоздании иерархии файлов специальные файлы копировались как обычные.

Опции -v и -n являются нестандартными и их использование в командных сценариях не рекомендуется.

СМОТРИ ТАКЖЕ

mv(1), rcp(1), umask(2), fts(3), symlink(7)

СТАНДАРТЫ Предполагается, что утилита cp совместима со стандартом IEEE Std 1003.2 (``POSIX.2"").

Updated: 12/29/2017 by Computer Hope

About cp

The cp command is makes copies of files and directories.

Syntax

cp [option ]... [-T ] source destination cp [option ]... source ... directory cp [option ]... -t directory source ... cp --help cp --version

Options

-a ,
--archive
Same as -dR --preserve=ALL . When performing the copy, attempt to preserve as much of the original file structure, attributes, and associated metadata as possible. This metadata includes security context data if you are running SELinux .
--attributes-only Don"t copy the file data, just create a file with the same attributes . If the destination file already exists, don"t alter its contents. You can control exactly which attributes are copied with the --preserve option.
--backup [= control ] Make a backup of each existing destination file that would otherwise be overwritten or removed. The control parameter specifies what version control method to use; see for details.

As a special case, cp --force --backup will make a backup of source when source and dest are the same, regular file.

-b Like --backup , but does not accept a control argument; the default control method is always used.
--copy-contents When operating recursively , copy contents of special files, such as FIFOs and devices found in /dev . You usually don"t want to use this option, because it can have undesired results, such as hanging forever or filling up your entire disk. However, this option is available for special, expert use cases.
-d Copy symbolic links themselves, rather than the files they refer to, and preserve hard links between source files in the copies. Same as "--no-dereference --preserve=links ".
-f ,
--force
If an existing destination file cannot be opened, remove it and try again. This option has no effect if the -n /--no-clobber option is used. However, it applies independently of -i /--interactive ; neither option cancels the effect of the other.
-i ,
--interactive
Prompt before overwrite (overrides a previous -n option).
-H Follow symlinks specified on the command line, but preserve discovered links.

The directory representing the mount point itself will be copied, but not traversed.

If -v is specified, you will see exactly which files have been skipped.

--help Display a help message, and exit.
--version Output version information, and exit.

By default, sparse source files are detected by a crude heuristic and the corresponding destination file is made sparse as well. That is the behavior selected by --sparse=auto . Specify --sparse=always to create a sparse destination file whenever the source file contains a long enough sequence of zero bytes. Use --sparse=never to inhibit creation of sparse files.

When --reflink [=always ] is specified, cp performs a lightweight copy, where the data blocks are copied only when modified. If this is not possible, the copy fails; or, if --reflink=auto is specified, cp falls back to a standard copy operation.

Version control

When using -b /--backup , the backup suffix is "~ ", unless set with --suffix or SIMPLE_BACKUP_SUFFIX . The version control method may be selected via the --backup= control option or through the VERSION_CONTROL environment variable . The possible values of control or VERSION_CONTROL are:

none , off Never make backups (even if --backup is given).
numbered , t Make numbered backups.
existing , nil Numbered if numbered backups exist, simple otherwise.
simple , never Always make simple backups.

As a special case, cp makes a backup of source when the force and backup options are given and source and destination are the same name for an existing, regular file.

Examples

Let"s say you have a file named picture.jpg in your working directory , and you want to make a copy of it called picture-02.jpg . You would run the command:

Cp picture.jpg picture-02.jpg

And the file will be copied. Here, picture.jpg is the source of the copy operation, and picture-02.jpg is the destination. Both files now exist in your working directory.

The source and destination files may also reside in different directories. For instance,

Cp /home/chuck/pictures/picture.jpg /home/chuck/backup/picture.jpg

Will make a copy of the file /home/chuck/pictures/picture.jpg in the directory /home/chuck/backup . The destination file will also be named picture.jpg .

If you are the user chuck , you can abbreviate your home directory ("/home/chuck ") using a tilde ("~ "). For instance,

Cp ~/pictures/picture.jpg ~/backup/picture.jpg

Functions the same as the above command when it is run by chuck .

Copying multiple files to a directory

Or, perhaps you want to copy multiple files into another directory. To accomplish this, you can specify multiple files as the source, and a directory name as the destination. Let"s say you are the user sally , and you have a bunch of files in the directory /home/sally/pictures/ named picture-01.jpg , picture-02.jpg , etc. and you want to copy them into the directory /home/sally/picture-backup/ . This command will do the trick:

Cp ~/pictures/picture-*.jpg ~/picture-backup cp -i oldfile newfile

If newfile already exists, you will be prompted:

Cp: overwrite ‘newfile’?

If you type y (or yes , Y , YES , or any other combination of upper and lowercase of these), then newfile will be overwritten with a copy of origfile . Typing anything else will abort the operation.

Copy a file into another directory

cp origfile /directory/subdirectory

origfile . The copy will be located in the directory /directory/subdirectory , and will be named origfile .

Cp origfile /directory/subdirectory/.

Same as the above command. The slash-dot (/. ) is implied in the above form of the command. (The dot is a special file in every Linux directory which means "this directory.")

Copy a file into another directory, and give it a new name

cp origfile /directory/subdirectory/newfile

Creates a copy of the file in the working directory named origfile . The copy will be named newfile , and will be located in the directory /directory/subdirectory .

Copy multiple files into another directory, using a wildcard

cp file* /directory/subdirectory

file into the directory /directory/subdirectory . The asterisk ("* ") is a wildcard — a special character which expands to match other characters. Specifically, the asterisk wildcard matches zero or more non-whitespace characters. For instance, this command will copy any files named file , file001 , file.txt , fileone.jpg , file-archive.zip , etc.

Cp file*.jpg /directory/subdirectory

Copy every file in the working directory whose name begins with file , and ends with the file extension .jpg . For instance, it would make copies of any files named file , file001.jpg , file002.jpg , or file-new.jpg , etc. The copies will be placed into the directory /directory/subdirectory .

Copy an entire directory structure to another location

cp -R /one/two /three/four

Copy the directory two (located in the directory /one ), and everything two contains, into the destination directory /three/four . The result will be called /three/four/two . The directory /three must already exist for the command to succeed. If the directory four does not already exist in the directory /three , it will be created.

Cp file1.txt newdir

Copies the file1.txt in the working directory to the newdir subdirectory.

Cp /home/public_html/mylog.txt /home/public_html/backup/mylog.bak

Copies the file mylog.txt in the public_html directory into the public_html/backup directory as mylog.bak .

Cp -u *.txt newdir

Copy all files ending in .txt into the newdir directory, but only if the files do not already exist in the new directory, or if the files being copied are newer.

Cp -R /home/hope/files/* /home/hope/backup

Recursively copies all the files, directories, and subdirectories in the /home/hope/files directory into the /home/hope/backup directory. If the directory backup does not exist in the directory /home/hope , it will be created.

cp --backup origfile newfile

If newfile newfile origfile . By default, the backup of newfile will be named newfile~ .

cp --backup=numbered origfile newfile

If newfile already exists, make a backup of the existing newfile before overwriting it with a copy of origfile . The backup of newfile will be named newfile.~1~ if no other backup exists, or newfile.~2~ if newfile.~1~ exists, etc.

Related commands

dd — Copy and convert the encoding of files.
ln — Create a link, or a symbolic link, to a file or directory.
mv — Move files and directories from one location to another, and optionally rename them.

Команда cp и есть та палочка-выручалочка, которая всегда придет на помощь. Если Вы только что установили линукс и у Вас не установлен , а для настройки выхода в интернет необходимо сконфигурировать определенные файлы, то команда cp выручит нас, как никакая другая.
Допустим, для настройки выхода в интернет Вам нужно изменить некоторые файлы, но из-за отсутствия прав доступа к ним Вы не можете этого сделать посредством графического интерфейса. Но зато Вы можете создать файл посредством графического интерфейса в любой доступной папке (например /home/имя_пользователя), заполнить его согласно инструкции или мануалу и, запустив с последующей , заменить при помощи команды cp существующий файл на созданным Вами.
Например, Вам, как и мне, понадобилось изменить файл /etc/network/interfaces. Лично я, при помощи графического интерфейса, создал файл interfaces в /home/viuktor/. Скопировал в него содержимое оригинала (файла /etc/network/interfaces), добавил нужные строки и сохранил. А потом, при помощи cp заменил файл /etc/network/interfaces файлом /home/viuktor/interfaces..
Правда, выполняя данную операцию, следует проявить максимальное внимание, ведь очень часто некоторые файлы требуется дополнить одной или более строками. Потому, если в мануле сказано «добавьте…», ни в коем случае не забывайте скопировать все из оригинала в созданный вами файл.

Команда cp применяется для копирования и переноса файлов.

Она имеет следующий синтаксис cp {параметр} <источник> <пункт назначения>

ОПИСАНИЕ В первой форме утилита cp копирует содержимое файла исходный_файл в целевой_файл. Во второй форме содержимое каждого указанного файла копи- руется в целевой_каталог. Имена самих файлов при этом не изменяются. Если cp обнаруживает попытку копирования файла самого в себя, копирование не производится. Имеются следующие опции: -H Если указана опция -R, следовать символическим ссылкам, указанным в командной строке, но не следовать символическим ссылкам, встречаю- щимся в процессе обхода дерева каталогов. -L Если указана опция -R, следовать всем символическим ссылкам. -P Если указана опция -R, не следовать никаким символическим ссылкам. Это режим работы по умолчанию. -R Если исходный_файл указывает на каталог, cp копирует этот каталог вместе со всем деревом файловой иерархии, которое он содержит. Ес- ли исходный_файл оканчивается на /, копируется не сам каталог, а только его содержимое. Эта опция также указывает на необходимость копирования символических ссылок, а не объектов, на которые они указывают, и заставляет cp создавать специальные файлы вместо того, чтобы копировать их, как обычные. Создаваемые каталоги имеют те же права доступа, что и исходные каталоги, вне зависимости от действу- ющего для процесса значения umask. Обратите внимание, что cp копирует жёсткие ссылки как отдельные файлы. Если вам нужно сохранять жёсткие ссылки, используйте tar(1), cpio(1) или pax(1). -f Для каждого уже существующего целевого имени пути, удалять его и создавать новый файл, не требуя подтверждения операции, вне зависи- мости от его прав доступа. (Опция -f отменяет действие любой из ранее указанных опций -i или -n.) -i Заставляет cp выдавать запрос через стандартный файл ошибок перед копированием файла, которое бы вызвало перезапись существующего файла. Если ответ, полученный со стандартного ввода, начинается символом `y" или `Y", будет предпринята попытка копирования. (Опция -i отменяет действие любой из ранее заданных опций -f или -n.) -l Создавать жёсткие ссылки на обычные файлы в иерархии вместо того, чтобы их копировать. -n Не перезаписывать существующие файлы. (Опция -n отменяет действие любой из предшествующих опций -f или -i.) -p Заставляет cp сохранять следующие атрибуты каждого исходного файла в создаваемой копии: время модификации, время доступа, флаги файла, режим доступа, идентификаторы пользователя и группы, насколько это позволено правами доступа. Если значения идентификаторов пользователя и группы не могут быть сохранены, не выводится никакого сообщения об ошибке, и возвращае- мое программой значение статуса завершения не изменяется. Если исходный файл имеет установленный бит set-user-ID и значение идентификатора пользователя не может быть сохранено, бит set-user- ID в атрибутах копии не сохраняется. Если исходный файл имеет установленный бит set-group-ID и значение идентификатора группы не может быть сохранено, бит set-group-ID в атрибутах копии не сохра- няется. Если исходный файл имеет установленные биты set-user-ID и set-group-ID и значение либо идентификатора пользователя, либо идентификатора группы не может быть сохранено, ни один из битов set-user-ID и set-group-ID в атрибутах копии не сохраняется. -v Выводить больше информации, показывая файлы по мере их копирования. Для каждого уже существующего целевого файла, его содержимое перезаписы- вается, если позволяют права. Его режим доступа и идентификаторы пользо- вателя и группы не изменяются, если не задана опция -p. Во второй синтаксической форме целевой_каталог должен существовать, если только не был указан единственный исходный_файл, являющийся каталогом, и опция -R. Если целевой файл не существует, используются права исходного файла, изменённые в соответствии со значением umask (см. csh(1)). Если исходный файл имеет установленный бит set-user-ID, этот бит сбрасывается, если только исходный файл и файл назначения не принадлежат одному владельцу. Если исходный файл имеет установленный бит set-user-ID, этот бит сбрасы- вается, если только исходный файл и файл назначения не принадлежат одной группе, а пользователь является членом этой группы. Если установлены оба бита, и set-user-ID, и set-group-ID, должны быть соблюдены оба вышеупомя- нутых условия, в противном случае оба этих бита сбрасываются. Для создания или перезаписи файлов требуются соответствующие права доступа. Утилита cp всегда следует символическим ссылкам, если только не указана опция -R (в этом случае она по умолчанию символическим ссылкам не сле- дует). Опции -H или -L (совместно с опцией -R) приводят к тому, что cp будет следовать символическим ссылкам, как описано выше. Опции -H, -L и -P игнорируются, если не указана опция -R. Кроме этого, эти опции отме- няют друг друга, и действия команды определяются той опцией, которая была указана последней. Если cp получает сигнал SIGINFO (см. аргумент status для stty(1)), на стандартный вывод будут выведены имена текущего исходного и целевого фай- лов, а также прогресс копирования в процентах. СТАТУС ЗАВЕРШЕНИЯ Утилита cp возвращает 0 в случае успешного завершения и >0 в случае воз- никновения ошибки. СОВМЕСТИМОСТЬ Старые версии cp имели опцию -r. Данная реализация поддерживает эту опцию, однако её поведение отличается от исторического. Использование этой опции настоятельно не рекомендуется, так как её поведение зависит от конкретной реализации. Во FreeBSD, -r является синонимом для -RL и рабо- тает так же, если это не переопределено другими флагами. Реализация -r в старых версиях отличалась тем, что при воссоздании иерархии файлов специ- альные файлы копировались как обычные. Опции -v и -n являются нестандартными и их использование в командных сце- нариях не рекомендуется. СМОТРИ ТАКЖЕ mv(1), rcp(1), umask(2), fts(3), symlink(7) ИСТОРИЯ Команда cp появилась в Version 1 AT&T UNIX.

В предыдущих разделах мы уже упоминали некоторые команды для работы с файлами и каталогами: pwd, cd, ls, ln, chmod. В этом разделе рассмотрим (очень кратко) еще несколько часто используемых команд.

4.6.1. Команды chown и chgrp

Эти команды служат для смены владельца файла и группы файла. Выполнять смену владельца может только суперпользователь, смену группы может выполнить сам владелец файла или суперпользователь. Для того, чтобы иметь право сменить группу, владелец должен дополнительно быть членом той группы, которой он хочет дать права на данный файл. Формат этих двух команд аналогичен:

# chown vasja имя-файла

# chgrp usersgrp имя-файла

4.6.2. Команда mkdir

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

$ mkdir /home/kos/book/glava5/part1

Команда mkdir может использоваться со следующими опциями:

    M mode — задает режим доступа для нового каталога (например, -m 755 ) ;

    P — создавать указанные промежуточные каталоги (если они не существуют).

4.6.3. Команда cat

Команда cat часто используется для создания файлов (хотя можно воспользоваться и командой touch ). По команде cat на стандартный вывод (т. е. на экран) выводится содержимое указанного файла (или нескольких файлов, если их имена последовательно задать в качестве аргументов команды). Если вывод команды cat перенаправить в файл, то можно получить копию какого-то файла:

$ cat file1 > file2

Собственно, первоначальное предназначение команды cat как раз и предполагало перенаправление вывода, так как эта команда создана для конкатенации, т. е. объединения нескольких файлов в один:

$ cat file1 file2 ... fileN > new-file

Именно возможности перенаправления ввода и вывода этой команды и используются для создания новых файлов. Для этого на вход команды cat направляют данные со стандартного ввода (т. е. с клавиатуры), а вывод команды — в новый файл:

$ cat > newfile

После того, как вы напечатаете все, что хотите, нажмите комбинацию клавиш < Ctrl>+ или < Ctrl>+, и все, что вы ввели, будет записано в newfile . Конечно, таким образом создаются, в основном, короткие текстовые файлы.

4.6.4. Команда cp

Хотя для копирования файлов иногда пользуются командой cat , но в Linux существует для этого специальная команда cp . Ее можно применять в одной из двух форм:

$ cp source destination

$ cp source_directory new_directory

В первом случае файл или каталог source копируется, соответственно, в файл или каталог destination, а во втором случае файлы, содержащиеся в каталоге source_directory копируются в каталог new_directory. Для копирования надо иметь права на чтение файлов, которые копируются, и права на запись в каталог, в который производится копирование.

Если в качестве целевого указывается существующий файл, то его содержимое будет затерто, поэтому при копировании надо соблюдать осторожность. Впрочем, можно использовать команду cp с опцией -i, тогда перед перезаписью существующего файла будет запрашиваться подтверждение (очень рекомендую вам всегда использовать эту опцию!).

У команды cp имеется еще несколько полезных опций (табл. 4.3).

Таблица 4.3. Основные опции команды cd.

Опция

Значение

Сохраняет время модификации файла и максимально возможные полномочия. Без этой опции для нового файла задаются полномочия, соответствующие полномочиям запустившего команду пользователя

R или -r

Если source — каталог, то копируется как он, так и все входящие в него подкаталоги, т. е. сохраняется исходная форма дерева каталогов

Если задать эту опцию, то символические ссылки будут оставаться ссылками (а иначе вместо ссылки копируется файл, на который дается ссылка)

Перезаписывать файлы при копировании (если такие уже есть) без дополнительных предупреждений

4.6.5. Команда mv

Если вам необходимо не скопировать, а переместить файл из одного каталога в другой, вы можете воспользоваться командой mv . Синтаксис этой команды аналогичен синтаксису команды cp . Более того, она сначала копирует файл (или каталог), а только потом удаляет исходный файл (каталог). И опции у нее такие же, как у cp .

Команда mv может использоваться не только для перемещения, но и для переименования файлов и каталогов (т. е. перемещения их внутри одного каталога). Для этого надо просто задать в качестве аргументов старое и новое имя файла:

$ mv oldname newname

Но учтите, что команда mv не позволяет переименовать сразу несколько файлов (используя шаблон имени), так что команда mv *.xxx *.yyy не будет работать.

При использовании команды mv , также как и при использовании cp , не забывайте применять опцию -i для того, чтобы получить предупреждение, когда файл будет перезаписываться.

4.6.6. Команды rm и rmdir

Для удаления ненужных файлов и каталогов в Linux служат команды rm (удаляет файлы) и rmdir (удаляет пустой каталог). Для того, чтобы воспользовался этими командами, вы должны иметь право записи в каталоге, в котором расположены удаляемые файлы или каталоги. При этом полномочия на изменение самих файлов не обязательны. Если хотите перед удалением файла получить дополнительный запрос на подтверждение операции, используйте опцию -i.

Если вы попытаетесь использовать команду rm (без всяких опций) для удаления каталога, то будет выдано сообщение, что это каталог, и удаления не произойдет. Для удаления каталога надо удалить в нем все файлы, после чего удалить сам каталог с помощью команды rmdir . Однако можно удалить и непустой каталог со всеми входящими в него подкаталогами и файлами, если использовать команду rm с опцией -r.

Если вы дадите команду rm * , то удалите все файлы в текущем каталоге. Подкаталоги при этом не удалятся. Для удаления как файлов, так и подкаталогов текущего каталога надо тоже воспользоваться опцией -r . Однако всегда помните, что в Linux нет команды восстановления файлов после их удаления (даже если вы спохватились сразу же после ошибочного удаления файла или каталога)!

Так что дважды подумайте до удаления чего-либо и не пренебрегайте опцией -i .

4.6.7. Команды more и less

Команда cat позволяет вывести на стандартный вывод (на экран) содержимое любого файла, однако она используется для этих целей очень редко, разве что для вывода очень небольших по объему файлов. Дело в том, что содержимое большого файла мгновенно проскакивает на экране, и пользователь видит только последние строки файла. Поэтому cat используется в основном по ее прямому назначению — для конкатенации файлов, а для просмотра содержимого файлов (конечно, текстовых) используются команды more и less (или текстовые редакторы).

Команда-фильтр more выводит содержимое файла на экран отдельными страницами, размером как раз в целый экран. Для того, чтобы увидеть следующую страницу, надо нажать на клавишу пробела. Нажатие на клавишу < Enter> приводит к смещению на одну строку. Кроме клавиш пробела и < Enter> в режиме паузы еще некоторые клавиши действуют как управляющие (например, клавиша возвращает вас на один экран назад), но мы здесь не будем приводить полного их перечня, как и перечня опций команды. Вам для начала надо еще только запомнить, что выйти из режима просмотра можно с помощью клавиши < Q> , так как если вы этого не знаете, то вам придется долго и нудно нажимать пробел, пока вы не доберетесь до конца длинного файла. Обо всех опциях команды more вы можете прочитать в интерактивном руководстве man или info.

Утилита less , разработанная в рамках проекта GNU, содержит все функции и команды управления выводом, имеющиеся в программе more , и некоторые дополнительные, например, позволяет использовать клавиши управления курсором (<Стрелка вверх>, <Стрелка вниз>, , ) для перемещения по тексту. Вспомните, мы уже говорили об этом, когда рассматривали интерактивную подсказкуman .

Команды more и less позволяют производить поиск подстроки в просматриваемом файле, причем команда less позволяет производить поиск как в прямом, так и в обратном направлении. Для организации поиска строки символов string надо набрать в командной строке программы в нижней части экрана (там, где двоеточие) /string. Если искомая строка будет найдена, будет отображен соответствующий кусок текста, причем найденная строка будет находиться в самом верху экрана.

4.6.8. Команда find и символы шаблонов для имен файлов

Еще одной часто используемой командой для работы с файлами в Linux является команда поиска нужного файла find . Команда find может искать файлы по имени, размеру, дате создания или модификации и некоторым другим критериям.

Общий синтаксис команды find имеет следующий вид:

find [список_каталогов] критерий_поиска

Параметр "список_каталогов" определяет, где искать нужный файл. Проще всего задать в качестве начального каталога поиска корневой каталог /, однако, в таком случае поиск может затянуться очень надолго, так как будет просматриваться вся структура каталогов, включая смонтированные файловые системы (в том числе сетевые, если таковые есть). Можно сократить объем поиска, если задать вместо одного корневого каталога список из нескольких каталогов (естественно, тех, в которых может находиться искомый файл):

$ find /usr/share/doc /usr/doc /usr/locale/doc -name instr.txt

Началом "критерия_поиска", определяющего, что именно должна искать программа find , считается первый аргумент, начинающийся на "-", "(", ")"", "," или "!". Все аргументы, предшествующие "критерию_поиска", трактуются как имена каталогов, в которых надо производить поиск. Если не указано ни одного пути, поиск производится только в текущем каталоге и его подкаталогах.

Чаще всего поиск проводится по именам файлов, как это показано в предыдущем примере, т. е. "критерий_поиска" задается как "-name имя_файла". Вместо опции -name можно использовать опцию -path, тогда команда будет искать совпадения в полном имени файла, с указанием пути. Например, команда

$ find . -path "./sr*sc"

найдет в текущем каталоге подкаталог "./src/misc". Вместо полного имени файла или каталога в этом примере использован так называемый "шаблон имени". Поскольку шаблоны имен файлов могут использоваться не только с командой find , но и со многими другими командами (включая уже рассмотренные команды chmod, chown, chgrp, cp, rm, cat, mv ), то правилам составления шаблонов стоит уделить некоторое внимание.

Чаще всего шаблоны имен файлов строятся с помощью специальных символов "*" и "?". Значок "*" используется для замены произвольной строки символов. В Linux

    "*" — соответствует всем файлам, за исключением скрытых;

    ".*" — соответствует всем скрытым файлам (но также текущему каталогу ". " и каталогу уровнем выше ".. ": не забывайте об этом!);

    "*.*" — соответствует только тем файлам и каталогам, которые имеют ". " в середине имени, или оканчиваются на точку;

    "p*r" — соответствует и "peter" и "piper";

    "*c*" — соответствует и "picked" и "peck".

Значок ? заменяет один произвольный символ, поэтому index?.htm будет соответствовать именам index0.htm, index5.htm и indexa.htm.

Кроме "*" и "?" в Linux при задании шаблонов имен можно использовать квадратные скобки , в которых дается либо список возможных символов, либо интервал, в который должны попадать возможные символы. Например, * соответствует всем именам файлов, начинающимся с a, b, c; * соответствует файлам, имена которых оканчиваются на I, J, K, L, M, N, 1, 2, 3.

А теперь вернемся к команде find и расскажем подробнее о том, какие критерии поиска возможны. Несколько примеров простых критериев поиска перечислены в табл. 4.4.

Таблица 4.4. Критерии поиска для команды find.

Опция

Значение

Name шаблон

Ищет файлы, имена которых соответствуют шаблону

Group имя

Ищет файлы, принадлежащие указанной группе

Size число [c]

Ищет файлы, размером в число 512-байтных блоков. Если после числа стоит символ c, значит размер указан в байтах (символах)

Mtime число

Ищет файлы, которые в последний раз изменялись указанное число дней назад

Newer образец

Ищет файлы, которые изменялись после изменения файла, указанного в образце

Type тип_файла

Ищет файлы указанного типа. Тип задается одним из символов b (блок-ориентированные устройства), c (байт-ориентированные устройства), d (файл каталога), f (обычный файл), p (именованный канал) либо l (символическая ссылка)

Другие простые критерии вы можете узнать, если просмотрите man-страницу о команде find . Здесь же надо только сказать, что из простых критериев можно строить более сложные с помощью логических операций and , or или операции отрицания, знаком которой служит восклицательный знак. Например, если вы хотите найти все файлы, имена которых оканчиваются на.txt и.doc, то критерий можно записать как (-name *.txt -or -name *.doc) . Можно комбинировать таким образом любое число критериев (и не только простых!). Если операция не указана явно, то подразумевается -and , т. е. вместо (-name *.txt -and -name *.doc) можно записать просто (-name *.txt -name *.doc) . Если применяется только одна операция -and или ! , то скобки обычно можно опустить, а с операцией -or и в сложных выражениях скобки необходимы. Перед скобкой нужно поставить обратную косую черту, а после скобки — пробел. Например, если вы хотите найти каталог по его имени, то можно сделать это командой

$ find /usr -name doc -type d

или (с соблюдением правил построения сложных критериев)

$ find /usr \(-name doc -and -type d \)

В следующем примере мы ищем файлы по такому критерию: либо имя файла оканчивается на *.tmp, либо размер файла больше 100 Кбайт.

$ find /home/kos \(\(-name *.tmp \) -or \(-size +200 \) \)

В последнем примере стоит обратить внимание на то, что перед значением размера стоит знак "+". Такой знак можно использовать с любым числовым параметром в критериях поиска команды find . Он означает, что нужно искать файлы, у которых значение параметра больше заданного. Соответственно, знак "- " означает, что надо искать файлы, у которых значение параметра меньше заданного. Если знаки + или — отсутствует, ищутся файлы, у которых значение параметра равно заданному.

Чтобы закончить рассмотрение команды find , надо сказать еще о том, что после критерия поиска в этой команде можно сразу же задать операцию, которая будет применяться ко всем файлам, найденным по указанному критерию. Простейшим примером использования такой возможности является указание команды -print .

$ find /home/kos -name *.tmp -print

по которой выдается на экран список имен всех найденных файлов с указанием полного пути к файлу. Эта операция применяется по умолчанию, т. е. когда никаких операций вообще не указано (как это было во всех приведенных выше примерах). Другим примером операции, применяемой ко всем найденным файлам, может служить операция -exec cmd {} \; , где cmd — произвольная команда оболочки shell. То есть в этом случае ко всем найденным файлам (их именами заменяются поочередно фигурные скобки) применяется команда cmd . За cmd {} в этом случае должна следовать точка с запятой, экранированная обратной косой чертой.

Например, если вы хотите удалить в текущем каталоге все файлы, к которым пользователи не обращались в течение 30 дней, дайте команду:

# find . -type f -atime +30 -exec rm {} \;

Вместо -exec можно поставить -ok, тогда перед выполнением указанной команды cmd применительно к каждому файлу будет запрашиваться подтверждение.

В общем, команда find является очень мощным, полезным и чрезвычайно адаптируемым инструментом поиска в файловой системе. Все ее возможности здесь не перечислены, изучайте соответствующую man-страницу. И будьте очень осторожны с применением таких возможностей команды, как вызов других команд, применяемых ко всем найденным файлам. Помните, что изменения часто необратимы!

4.6.9. Команда split — разбиваем файл на несколько частей

Иногда бывает необходимо разбить один большой файл на несколько файлов меньшего объема. Для примера рассмотрим ситуацию, когда вы хотите перенести на свой домашний компьютер файл song.mp3 формата "MP3", размером в 4,894,425 байт. Возможности перекачать этот файл по сети у вас нет, и единственно возможный способ переноса — воспользоваться дискетами. Но, поскольку на одну дискету файл не помещается, требуется разбить его на несколько маленьких файлов, а потом "собрать" снова. Для решения этой задачи можно воспользоваться командой split .

Команда split копирует файл, разбивая его на отдельные файлы заданной длины. В качестве аргументов ей надо указать имя исходного файла и префикс имен выходных файлов. Имена выходных файлов будут составляться из этого префикса и двух дополнительных букв `aa" , `ab" , `ac" и т. д. (без пробелов и точек между префиксом и буквами). Если префикс имен файлов не задан, то по умолчанию используется ‘x’, так что выходные файлы будут называться ` xaa" , ` xab"и т. д. .

Кроме аргументов можно задать опцию -b, определяющую размер выходных файлов в байтах. Вслед за -b должно стоять число, а за ним — буква k (показывающая, что размер выходного файла указан в килобайтах) или m (значит размер задан в мегабайтах). Если опция не задана, то по умолчанию размер выходных файлов принимается равным 1 Мбайту. Таким образом, чтобы перенести на дискетах файл song.mp3 надо вначале дать команду

$ split -b1400k song.mp3 song.

скопировать полученные файлы song.aa, song.ab, song.ac, song.ad, song.ae на отдельные дискеты, перенести их на домашний компьютер, скопировать в какой-нибудь каталог и восстановить исходный файл с помощью команды

$ cat song.* > song.mp3

после чего можно удалить временные файлы song.xx.

4.6.10. Сравнение файлов и команда patch

Вы не замечали, что задача сравнения содержимого двух различных файлов возникает при работе с компьютером удивительно часто? Конечно, ведь так легко скопировать файл, а потом забываешь, какая же из версий новее или качественнее (по одному автору ведомым критериям). Так что инструменты для сравнения файлов просто необходимы и Linux такие инструменты предоставляет.

Простейший из них — команда cmp . Эта команда просто сравнивает содержимое двух файлов по-байтно:

$ cmp file1 file2

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

Конечно, информации, выдаваемой командой cmp , маловато для того, чтобы принять, например, решение о том, какой из двух файлов нам более ценен. Поэтому стоит воспользоваться командой diff для получения полного отчета о том, каковы же различия в интересующих нас файлах. Для получения отчета достаточно указать команде, какие именно файлы сравнивать:

$ diff paper.old paper.new

Отчет о выявленных различиях будет выдан на стандартный выход. Естественно, его лучше перенаправить в файл:

$ diff paper.old paper.new >paper.diff

Для оценки версий одного и того же файла более удобна может оказаться команда sdiff , которая выдает результат сравнения в виде двух столбцов, разделенных пробелами. Если строки с одинаковыми номерами в файлах различаются, то в выводе команды sdiff они разделены вертикальной чертой | . Если строка имеется только в первом файле, она отмечена знаком < . Соответственно, строка, встречающаяся только во втором файле, помечена знаком > .

Существует также команда diff3 , которая позволяет сравнить сразу 3 файла.

Но все же наиболее часто используется традиционная для UNIX-систем команда diff . Эта ее востребованность объясняется тем, что создаваемый ею отчет о различиях двух файлов может быть использован командой patch . Чаще всего эти возможности используются при распространении обновлений программного обеспечения. Предположим, что некоторое программное приложение было разослано пользователям в виде файла program.c, содержащего исходный код программы на языке Си. После этого разработчик внес в программу некоторые исправления и сохранил текст в виде файла program.c.new. Требуется довести исправленный текст программы до пользователей. Очевидно, что пользователям достаточно сообщить только исправления, т. е. отчет об изменениях, создаваемый по команде

$ diff program.c program.c.new > program.c.diff

Естественно, объем файла program.c.diff существенно меньше объема файла program.c.new, так что можно было бы получить существенную экономию на передаче файлов, если отправлять пользователям только файл program.c.diff(ведь объемы современных программных приложений составляют десятки мегабайт).Однако пользователи должны иметь возможность внести эти исправления в имеющуюся у них версию программы. Эту задачу позволяет решить команда patch . Имея файлы program.c и program.c.diff, пользователь может дать команду

$ patch program.c program.c.diff > program.c.new

в результате выполнения которой он получит файл program.c.new.

В. Костромин (kos at rus-linux dot net) - 4.6. Команды для работы с файлами и каталогами