이 두 명령 사이에 차이점이 있습니까?

이 두 명령 사이에 차이점이 있습니까?
cat a > b

그리고

cp a b

모든 의도와 목적에 대해 기능적으로 동일하다면 어느 것이 더 빠릅니까?

답변1

기능적인 측면에서는 동일하다고 생각합니다.

어느 쪽이 더 빠른지 추측해야 한다면, 나는 다음과 같이 말할 것입니다.CP명령의 목적은 복사 목적으로만 파일 작업을 수행하는 것이므로 이에 최적화되어 있습니다.

고양이, 대조적으로 다음을 의미합니다.사슬 같이 잇다여러 파일을 하나의 시리즈로 결합하는 것을 의미합니다. 파일을 지정하지 않으면 콘솔에 파일이 표시됩니다(알려준 @bahamat에게 감사드립니다). 이 예에서는 출력이 다른 파일로 리디렉션됩니다. 나는 이 간접 참조가 직접 참조보다 덜 효율적이라고 생각합니다 cp.

일반 크기 파일의 경우 차이가 눈에 띄는지는 모르겠지만 매우 큰 파일의 경우 시간을 측정하는 것이 흥미로울 것입니다. /usr/bin/time을 사용하여 반복 시험을 수행하고 하나가 다른 것보다 지속적으로 빠르거나 느린지 확인할 수 있을 것 같습니다.

이에 대해 물어보는 특별한 이유가 있습니까, 아니면 단순한 호기심입니까(물론 전혀 문제가 되지 않습니다).

답변2

기능적으로는 비슷하지만 구체적으로 다릅니다. 기본적으로 둘 다 첫 번째 파일에서 많은 데이터를 읽고 이를 다른 파일에 씁니다.

내가 할 때스트레이스리눅스에서:

$ 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)                           = ?

답변3

큰 차이는 없습니다. 둘 다 이전 파일의 내용을 동일한 내용이 포함된 새 파일에 복사합니다. 둘 다 기존 파일인 경우 대상을 덮어씁니다.

일부 오래된 시스템에서는 을 사용하여 바이너리 파일을 복사하려고 하면 복사가 중지되거나 줄이 잘릴 cat수 있습니다. 널 문자로 인해 질식할 수 있기 때문입니다. 나는 당신이 지금 접하게 될 어떤 유닉스 시스템에도 문제가 있다고 생각하지 않습니다. cp문제가 없다는 것이 보장됩니다.

cp디렉터리를 대상으로 지정할 수 있습니다. 파일은 새 디렉터리에 원본과 동일한 이름을 갖도록 복사됩니다.

대상이 존재하지 않으면 cp현재 수정된 소스 파일의 권한 비트를 사용합니다.우마스크.

다음을 사용하여 셸에서 옵션을 cat … >target설정 하면 대상 파일을 덮어쓰는 것을 방지할 수 있습니다.noclobberset -C. 옵션( ) cp을 전달하여 대상 파일을 덮어쓰는 것을 방지할 수 있습니다 . 확인을 요청할 것입니다.-ialias cp='cp -i'cp

원본 파일의 날짜를 보존하는 것이 유용한 경우가 많습니다. 당신은 cp -p그것을 사용할 수 있습니다 .

성능은 파일 크기, 파일 시스템, 소스 및 대상 디스크 종류, 운영 체제 등에 따라 달라집니다.Linux의 원시 디스크 복사본의 경우, 나는 차이가 없다는 것을 알았습니다.

답변4

fasterCP보다 고양이가 더 나은 것 같아

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

관련 정보