Существует ли различие между этими двумя командами?

Эволюция прекрасна, но тяжелая. Sylpheed более прост и не использует в качестве многих ресурсов.

5
30.06.2012, 05:28
5 ответов

С точки зрения функциональности я думаю, что они - то же.

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

кошка, в отличие от этого, предназначена, связывают файлы, означая присоединение к нескольким файлам в ряд. Если никакой файл не будет указан, то это отобразит файл к консоли (благодаря @bahamat для напоминания нам). В этом примере вывод перенаправляется в другой файл. Я думаю, что эта косвенность была бы менее эффективной, чем прямое cp.

Я не знаю, было ли различие заметным для регулярных размерных файлов, хотя это было бы интересно времени они на очень больших файлах. Я предполагаю, что можно было сделать повторенные пробные версии с/usr/bin/time и видеть, более быстры ли Вы последовательно/медленнее, чем другой.

У Вас есть какая-либо конкретная причина спросить об этом, или это просто простое любопытство (ничто неправильно с этим вообще, конечно)

6
27.01.2020, 20:33
  • 1
    я также задаюсь вопросом, существуют ли некоторые странные случаи где cat мог бы изменить содержание, поскольку это передает его через тогда как cp не был бы. Я не знаю достаточно о деталях того, что продолжается здесь. То, что управляло мной для задавания вопроса, я видел в одном из моих сценариев оболочки две задачи, выполняя то же самое, но с помощью этих различных методов и я начал задаваться вопросом, чем различие было между ними, и если я имел это в виду, когда я записал им. –  Steven Lu 30.06.2012, 05:38
  • 2
    я также задаюсь вопросом, существуют ли некоторые странные случаи где cat мог бы изменить содержание, поскольку это передает его через тогда как cp не был бы. Я не знаю достаточно о деталях того, что продолжается здесь. То, что управляло мной для задавания вопроса, я видел в одном из моих сценариев оболочки две задачи, выполняя то же самое, но с помощью этих различных методов и я начал задаваться вопросом, чем различие было между ними, и если я имел это в виду, когда я записал им. –  Steven Lu 30.06.2012, 05:38
  • 3
    Между 2 существует 1 важное функциональное различие; полномочия. cp попытается сохранить те же полномочия файла (режим) на новом файле, как находятся на оригинале. Очевидно, это не может быть возможно из-за ограничений файловой системы или других факторов все же. –  Patrick 30.06.2012, 05:39
  • 4
    cat не должен отображать файл на экран. cat коротко для, "конкатенируют", который определяется как, "для объединения в ряду или цепочке". Исходная цель cat должен был объединить несколько файлов в один (например, cat file1 file2). Это именно так происходит, который при объединении одного файла ни с чем, он печатает только что один. –  bahamat 30.06.2012, 09:13
  • 5
    @Patrick cp сохранит те же полномочия только если -p опция используется. Иначе это создаст абсолютно новый файл согласно umask. Проблемой о метках времени является то же. –  rush 30.06.2012, 11:09
  • 6
    @JamesMcLeod там не является такой вещью EOF это cat отвечает на при чтении из файла. @Steven cat разработан, чтобы быть совершенно прозрачным. Это ничего не изменяет. –  jippie 30.06.2012, 11:11

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

Когда я делаю 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)                           = ?
4
27.01.2020, 20:33
  • 1
    Сделал Вы забываете -f в Вашем strace команды кошки, или где открытое для FD 1? –  Nils 30.06.2012, 23:31
  • 2
    @Nils там уже не открыт для FD 1, его открытый, когда программа выполнена (программы наследовали открытые дескрипторы файлов, и FD 1 уже открыт оболочкой). –  Patrick 30.06.2012, 23:56

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

Когда я делаю 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)                           = ?
4
27.01.2020, 20:33

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

Некоторые старые системы могли бы прекратить копировать или усечь строки, при попытке скопировать двоичные файлы с cat, потому что они могли бы дросселировать на нулевых символах. Я не думаю никакая система Unix, с которой Вы, вероятно, встретитесь, теперь имеет проблему там. cp как гарантируют, не будет иметь проблему.

cp позволяет Вам указывать каталог как месту назначения: файл копируется, чтобы иметь то же имя как оригинал в новом каталоге.

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

Можно защитить от перезаписи конечного файла при выполнении cat … >target путем установки noclobber опция в оболочке с set -C. Можно защитить от перезаписи конечного файла с cp путем передачи -i опция (alias cp='cp -i'); cp попросит подтверждение.

Часто полезно сохранить дату исходного файла. Можно использовать cp -p для этого.

Производительность будет варьироваться, в зависимости от размера файла, файловой системы, вида входного и выходного диска, операционной системы, и т.д. Поскольку неструктурированный диск копирует в соответствии с Linux, я не нашел рядом ни с каким различием.

3
27.01.2020, 20:33

Будьте похожи на кошку, 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
0
27.01.2020, 20:33
  • 1
    Делает time также включайте > операция, только команды кошки самой? –  Bernhard 30.06.2012, 14:11
  • 2
    Да. Это включает > операция. Время берет command как аргумент –  SHW 30.06.2012, 14:13
  • 3
    Ваше измерение ничего не доказывает. Время является слишком маленьким, чтобы измеряться точно. –  Gilles 'SO- stop being evil' 30.06.2012, 16:19
  • 4
    Да. Но можно перепроверить против файлов ГБ. –  SHW 30.06.2012, 18:31
  • 5
    Повторите свой тест с другим использованием файла cat сначала. Затем кошка, вероятно, медленнее, чем cp. Я подозреваю, что Вы видите, что файл считан из кэша во второй команде. –  Nils 30.06.2012, 23:34

Теги

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