cp 및 cat 복사 파일

cp 및 cat 복사 파일

cp a b그리고 cat a > b차이점은 무엇입니까?

Linux 커널 소스 트리의 x86 설치 스크립트에서는 arch/x86/boot/install.sh두 가지가 모두 사용됩니다.

cat $2 > $4/vmlinuz
cp $3 $4/System.map

한 형식이 다른 형식보다 낫다면 동일하게 유지되지 않는 이유는 무엇입니까?

답변1

catvs가 cp중요한 차이를 만드는 또 다른 질문이 떠오릅니다 .

정의에 따르면 cat은 희소 파일을 확장하여 "실제" 0바이트로 공백을 채우는 반면, cp는 최소한 해당 구멍을 보존하도록 지시할 수 있습니다.

스파스 파일은 공간을 보존하기 위해 0바이트 시퀀스가 ​​메타데이터로 대체된 파일입니다. dd로 하나를 생성한 다음 원하는 도구를 사용하여 복사하여 이를 테스트할 수 있습니다.

  1. 스파스 파일을 만듭니다(문제를 방지하려면 미리 /tmp로 변경 - 마지막 참고 사항 참조).

    15> cd /tmp
    16> dd if=/dev/null of=sparsetest bs=512b seek=5 
    0+0 records in 
    0+0 records out 
    0 bytes (0 B) copied, 5.9256e-05 s, 0.0 kB/s
    
  2. 크기를 조정하세요. 공간을 차지하지 않아야 합니다.

    17> du -sh sparsetest
    0       sparsetest
    
  3. cp로 복사하고 크기를 확인하세요

    18> cp sparsetest sparsecp
    19> du -sh sparsecp
    0       sparsecp
    
  4. 이제 cat을 사용하여 복사하고 크기를 확인하세요.

    20> cat sparsetest > sparsecat
    21> du -sh sparsecat
    1.3M    sparsecat
    
  5. 즐겨 사용하는 도구를 사용해 동작을 확인해보세요.

  6. 청소하는 것을 잊지 마세요.

마지막 참고 사항: 로컬 시스템 관리자 백업 계획의 일부로 또는 시스템 상태에 중요한 파일 시스템에서 이러한 실험을 수행하는 경우 이러한 실험을 통해 로컬 시스템 관리자 사이에서 평판이 향상될 가능성이 있습니다. 그가 선택한 백업 도구에 따라 테라바이트로 확장되는 0바이트 파일을 백업하는 데 생각보다 더 많은 테이프 미디어가 필요할 수도 있습니다.

cat 또는 cp를 사용하여 복사할 수 없는 다른 파일에는 장치 특수 파일 등이 포함됩니다. 장치 노드를 복사할 수 있는지 또는 해당 내용을 복사할 수 있는지 여부는 복사 도구의 구현에 따라 달라집니다.

답변2

~에 따르면키스의 코멘트, cp일부 권한을 유지하고 cat지침에 따라 새 파일을 만듭니다 umask. 따라서 $2권한이 유지되지 않아 $4/vmlinuz매우 깔끔하지만, 이상한 권한이 설정되어 있으면 $3보존 $4/System.map됩니다.

답변3

두 경우 모두 동일한 기능을 갖지만 cp는 순전히 파일 작업입니다. "이 파일을 가지고 거기에 복사본을 만드십시오."

반면에 cat의 목적은 파일 내용을 콘솔에 덤프하는 것입니다. "이 파일을 가져와 화면에 표시"한 다음 닌자가 화면을 공격하고 출력을 다른 곳으로 리디렉션하도록 합니다.

cp는 리디렉션이 없고 바이트가 위치 A에서 위치 B로 직접 복사되기 때문에 일반적으로 더 효율적입니다.

고양이는 될 것입니다 read bytes -> output to console -> intercept output -> redirect to new file.

답변4

catcat입력 파일이 제공되지 않을 때 대화형이 되어 시간을 낭비하게 만드는 일부 Makefile/스크립트에서 여기저기서 볼 수 있습니다. 낭비되기도 한다진짜 돈빌드 도구가 오랫동안 정지되는 경우.

OP의 예를 사용하여 설명하겠습니다.

$2및 가 빈 쉘 문자열 이라고 가정해 봅시다 $3(어떤 나쁜 이유든 :\ ):

cat $2 > $4/vmlinuz     # waits forever
cp $3 $4/System.map     # returns an error immediately

나는 이제 가능한 경우 cpor installover 를 사용하는 경향이 있습니다 cat.

흥미로운 답변과 의견이 있습니다. 감사합니다!

관련 정보