С точки зрения функциональности я думаю, что они - то же.
Если бы я должен был рисковать предположением, о котором быстрее, то я сказал бы, что команда CP, потому что ее цель состоит в том, чтобы сделать операции файла только в целях копии, таким образом, она была бы оптимизирована для этого.
кошка, в отличие от этого, предназначена, связывают файлы, означая присоединение к нескольким файлам в ряд. Если никакой файл не будет указан, то это отобразит файл к консоли (благодаря @bahamat для напоминания нам). В этом примере вывод перенаправляется в другой файл. Я думаю, что эта косвенность была бы менее эффективной, чем прямое cp
.
Я не знаю, было ли различие заметным для регулярных размерных файлов, хотя это было бы интересно времени они на очень больших файлах. Я предполагаю, что можно было сделать повторенные пробные версии с/usr/bin/time и видеть, более быстры ли Вы последовательно/медленнее, чем другой.
У Вас есть какая-либо конкретная причина спросить об этом, или это просто простое любопытство (ничто неправильно с этим вообще, конечно)
Функционально подобный, но специфически отличающийся. По существу они оба читают набор данных из первого файла, пишут это в другой файл.
Когда я делаю strace на Linux:
$ strace cat /etc/fstab > test.txt
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
fadvise64_64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(1, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
$ strace cp /etc/fstab test.log
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
open("test.log", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0644) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(4, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768) = 0
close(4) = 0
close(3) = 0
_llseek(0, 0, 0xbfaa3fb0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
-f
в Вашем strace команды кошки, или где открытое для FD 1?
– Nils
30.06.2012, 23:31
Функционально подобный, но специфически отличающийся. По существу они оба читают набор данных из первого файла, пишут это в другой файл.
Когда я делаю strace на Linux:
$ strace cat /etc/fstab > test.txt
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
fadvise64_64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(1, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
$ strace cp /etc/fstab test.log
...
open("/etc/fstab", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=691, ...}) = 0
open("test.log", O_WRONLY|O_CREAT|O_EXCL|O_LARGEFILE, 0644) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
read(3, "# /etc/fstab: static file system"..., 32768) = 691
write(4, "# /etc/fstab: static file system"..., 691) = 691
read(3, "", 32768) = 0
close(4) = 0
close(3) = 0
_llseek(0, 0, 0xbfaa3fb0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
Нет большого различия: оба копируют содержание старого файла в новый файл с тем же содержанием. Оба перезаписывают цель, если это - существующий файл.
Некоторые старые системы могли бы прекратить копировать или усечь строки, при попытке скопировать двоичные файлы с cat
, потому что они могли бы дросселировать на нулевых символах. Я не думаю никакая система Unix, с которой Вы, вероятно, встретитесь, теперь имеет проблему там. cp
как гарантируют, не будет иметь проблему.
cp
позволяет Вам указывать каталог как месту назначения: файл копируется, чтобы иметь то же имя как оригинал в новом каталоге.
Если место назначения не существует, cp
использует биты полномочий исходного файла, измененного текущим umask.
Можно защитить от перезаписи конечного файла при выполнении cat … >target
путем установки noclobber
опция в оболочке с set -C
. Можно защитить от перезаписи конечного файла с cp
путем передачи -i
опция (alias cp='cp -i'
); cp
попросит подтверждение.
Часто полезно сохранить дату исходного файла. Можно использовать cp -p
для этого.
Производительность будет варьироваться, в зависимости от размера файла, файловой системы, вида входного и выходного диска, операционной системы, и т.д. Поскольку неструктурированный диск копирует в соответствии с Linux, я не нашел рядом ни с каким различием.
Будьте похожи на кошку, faster
чем CP
root@SHW:/tmp# time cp debug.log test1
real 0m0.021s
user 0m0.000s
sys 0m0.000s
root@SHW:/tmp# time cat debug.log > test2
real 0m0.013s
user 0m0.000s
sys 0m0.000s
root@SHW:/tmp# du -h debug.log
4.0K debug.log
root@SHW:/tmp# file debug.log
debug.log: ASCII text
cat
сначала. Затем кошка, вероятно, медленнее, чем cp
. Я подозреваю, что Вы видите, что файл считан из кэша во второй команде.
– Nils
30.06.2012, 23:34
cat
мог бы изменить содержание, поскольку это передает его через тогда какcp
не был бы. Я не знаю достаточно о деталях того, что продолжается здесь. То, что управляло мной для задавания вопроса, я видел в одном из моих сценариев оболочки две задачи, выполняя то же самое, но с помощью этих различных методов и я начал задаваться вопросом, чем различие было между ними, и если я имел это в виду, когда я записал им. – Steven Lu 30.06.2012, 05:38cat
мог бы изменить содержание, поскольку это передает его через тогда какcp
не был бы. Я не знаю достаточно о деталях того, что продолжается здесь. То, что управляло мной для задавания вопроса, я видел в одном из моих сценариев оболочки две задачи, выполняя то же самое, но с помощью этих различных методов и я начал задаваться вопросом, чем различие было между ними, и если я имел это в виду, когда я записал им. – Steven Lu 30.06.2012, 05:38cp
попытается сохранить те же полномочия файла (режим) на новом файле, как находятся на оригинале. Очевидно, это не может быть возможно из-за ограничений файловой системы или других факторов все же. – Patrick 30.06.2012, 05:39cat
не должен отображать файл на экран.cat
коротко для, "конкатенируют", который определяется как, "для объединения в ряду или цепочке". Исходная цельcat
должен был объединить несколько файлов в один (например,cat file1 file2
). Это именно так происходит, который при объединении одного файла ни с чем, он печатает только что один. – bahamat 30.06.2012, 09:13cp
сохранит те же полномочия только если-p
опция используется. Иначе это создаст абсолютно новый файл согласноumask
. Проблемой о метках времени является то же. – rush 30.06.2012, 11:09cat
отвечает на при чтении из файла. @Stevencat
разработан, чтобы быть совершенно прозрачным. Это ничего не изменяет. – jippie 30.06.2012, 11:11