![이 두 명령 사이에 차이점이 있습니까?](https://linux55.com/image/23595/%EC%9D%B4%20%EB%91%90%20%EB%AA%85%EB%A0%B9%20%EC%82%AC%EC%9D%B4%EC%97%90%20%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
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
. 왜냐하면 널 문자가 차단될 수 있기 때문입니다. 나는 이것이 현재 사용하고 있는 UNIX 시스템에서는 문제가 되지 않을 것이라고 생각합니다. cp
문제가 없을 것이라고 보장합니다.
cp
디렉터리를 대상으로 지정할 수 있습니다. 파일은 원본 파일과 동일한 이름으로 새 디렉터리에 복사됩니다.
대상이 존재하지 않으면 cp
소스 파일의 권한 비트가 사용되며 현재 파일에 의해 수정됩니다.마스크.
쉘에서 cat … >target
옵션을 설정하여 대상 파일을 덮어쓰는 것을 방지 할 수 있습니다.noclobber
set -C
. 옵션( ) 을 cp
전달하면 대상 파일을 덮어쓰는 것을 방지 할 수 있습니다 .-i
alias cp='cp -i'
cp
원본 파일의 날짜를 유지하는 것이 유용한 경우가 많습니다. 당신은 그것을 사용할 수 있습니다 cp -p
.
성능은 파일 크기, 파일 시스템, 소스 및 대상 디스크 유형, 운영 체제 등에 따라 달라집니다.Linux에서 원시 디스크 복사의 경우, 나는 거의 차이를 발견하지 못했습니다.
답변4
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