재귀 작업에서 별표 와일드카드를 사용하는 것의 중요성은 무엇입니까?

재귀 작업에서 별표 와일드카드를 사용하는 것의 중요성은 무엇입니까?

LPIC-1 PDF를 읽고 있습니다. 그것은 말한다:

일반적으로 디렉토리의 전체 내용을 복사하려면 다음을 사용합니다.

cp -r 소스 경로/* 대상 경로

하지만 *가 없는 -r 옵션 자체만으로는 충분하지 않은 이유를 이해할 수 없습니다. 맞아야합니까?

감사해요.

편집: 나는 그것을 시도했고 결과는 흥미로웠습니다. 첫째, 대상이 존재하지 않는 경우 소스의 * 와일드카드는 대상 디렉터리가 없기 때문에 오류를 발생시킵니다. *cp가 없으면 최상위 디렉터리와 하위 디렉터리에 숨겨진 파일을 포함하여 모든 숨겨진 파일이 복사됩니다.

반면에 대상이 존재하고 소스에서 * 와일드카드를 사용하는 경우 cp는 맨 위에 있는 모든 파일(숨겨진 파일 제외)을 복사하지만 하위 디렉터리의 숨겨진 파일도 포함합니다.

[rocky@rocky ~]$ tree -a test1
test1
├── .hiddentestfile1
├── test2
│   ├── .hiddentestfile2
│   └── testfile2
└── testfile1

1 directory, 4 files
[rocky@rocky ~]$ cp -r test1/* newdest
cp: target 'newdest' is not a directory
[rocky@rocky ~]$ cp -r test1/ newdest
[rocky@rocky ~]$ tree -a newdest
newdest
├── .hiddentestfile1
├── test2
│   ├── .hiddentestfile2
│   └── testfile2
└── testfile1

1 directory, 4 files
[rocky@rocky ~]$ rm -r newdest
[rocky@rocky ~]$ mkdir newdest
[rocky@rocky ~]$ cp -r test1/* newdest
[rocky@rocky ~]$ tree -a newdest
newdest
├── test2
│   ├── .hiddentestfile2
│   └── testfile2
└── testfile1

1 directory, 3 files

답변1

cp -r SOURCE_PATH/* DEST_PATH

각 (숨겨지지 않은) 파일이나 디렉터리와 그 내용을 DEST_PATH에 반복적으로 복사합니다(이것이 디렉터리이거나 디렉터리에 대한 심볼릭 링크라고 가정).

그런 다음 SOURCE_PATH에 , 및 가 file포함 되어 있으면 sum 으로 끝납니다 .dir.gitDEST_PATH/fileDEST_PATH/dir

DEST_PATH존재하지 않거나 디렉터리가 아니고 SOURCE_PATH숨겨지지 않은 파일이나 디렉터리(예: )만 포함하는 경우 해당 디렉터리 SOURCE_PATH/file는 복사되지 않고 복사됩니다 cp -r SOURCE_PATH/file DEST_PATH. 이는 DEST_PATH의 복사본이 생성됨을 의미합니다( 또는 덮어쓰기) file. 명령에서 DEST_PATH에 추가하면 /이런 일이 발생하지 않습니다(복사 또는 실패 보장).디렉토리가 아님-t; GNU 옵션 도 참조하세요 cp.

그리고:

cp -r SOURCE_PATH DEST_PATH

SOURCE_PATH 디렉터리(숨겨진 파일을 포함하여 해당 내용을 반복적으로 포함)를 DEST_PATH에 복사하면(다시 한번 디렉터리가 존재하고 디렉터리라고 가정 ) , 로 끝납니다 DEST_PATH/SOURCE_PATH. DEST_PATH/SOURCE_PATH/{.git,dir,file}따라서 완전히 다른 결과가 나타납니다.

여기에 모두 복사하세요콘텐츠SOURCE_PATH(숨겨진 파일 포함) SOURCE_PATH 자체를 DEST_PATH에 넣는 대신 다음을 사용하는 것이 좋습니다.

cp -r SOURCE_PATH/. DEST_PATH

숨겨진 파일도 포함하는 것 외에도(zsh를 가정하면 해당 파일도 사용할 수 있음 cp -r SOURCE_PATH/*(D) DEST_PATH/) 다음과 같은 경우 실패하지 않는다는 장점이 있습니다.너무 많이 논쟁하다SOURCE_PATH에 숨겨지지 않은 파일이 너무 많으면 오류가 보고됩니다. SOURCE_PATH가 비어 있으면 오류가 보고되지 않습니다. 또한 DEST_PATH가 존재하지 않으면 결국 SOURCE_PATH의 복사본으로 생성됩니다.

GNU 구현을 사용하면 cp동일한 작업을 수행할 수 있습니다.

cp -rT SOURCE_PATH DEST_PATH

( 대상이 디렉터리인 경우에도 복사 대상 대신 강제 복사 -T라고도 함 )--no-target-directory

관련 정보