cp --no-target-directory 설명

cp --no-target-directory 설명

질문:를 사용하는 방법을 보여주기 위해 간단한 예가 필요합니다 cp --no-target-directory.

나는 그것을 이해하는 데 약간의 어려움을 겪었습니다 cp --no-target-directory. 알겠어요설명mv --no-target-directory, 그러나 나는 그것을 사용하는 방법을 정말로 상상할 수 없습니다 cp.

예를 들어, 명령이 mv /tmp/source /tmp/dest성공하더라도 이름이 다음으로 변경된다는 보장은 없습니다 /tmp/source. 다른 프로세스에서 디렉터리를 생성한 경우 /tmp/dest이름이 변경되었을 수 있습니다. 그러나 성공하면 /tmp/dest`는 문제가 되지 않습니다. (/tmp/dest/source/tmp/destmv -T /tmp/source /tmp/dest/tmp/source was renamed to원천)

답변1

기본적으로 cp마지막 인수가 기존 디렉터리인지 테스트합니다. 이런 일이 발생하면 cp해당 디렉터리 내에 소스의 기본 이름이 포함된 링크가 생성됩니다. 즉, 명령이 주어지면

cp foo/bar wibble

wibble존재하는 경우 cp소스를 디렉토리에 복사합니다 wibble/bar. wibble존재하지 않는 경우 cp소스를 디렉토리에 링크합니다 wibble.

복사본을 항상 사용할 수 있도록 하려면 (별칭 ) 옵션을 wibble지정할 수 있습니다 . 이렇게 하면 성공하면 복사본이 호출되었는지 확인할 수 있습니다 . 이미 디렉토리로 존재 하면 실패합니다 .--no-target-directory-Tcpwibblewibblecp

표 형식:

The target is …             Without -T               With -T
existing directory          copy in the directory    error
existing file (not dir)     overwrite                overwrite
does not exist              create                   create

유일한 차이점은 -T대상이 기존 디렉터리인 경우 명령이 오류를 반환한다는 것입니다. 이는 디렉터리가 존재하지 않을 것으로 예상할 때 유용합니다. 예상치 못한 일이 발생하는 대신 오류 메시지가 표시됩니다.

mv및 에도 동일하게 적용됩니다 ln. 대상이 기존 디렉터리인 경우 -T다른 작업을 자동으로 수행하는 대신 오류 신호를 보냅니다.

의 경우에는 cp상황이 다릅니다. 재귀 복사를 수행하고 소스가 디렉터리인 경우 cp -T소스 자체가 아닌 소스 내용이 대상에 복사됩니다. 즉 주어진

$ tree source destination 
source
└── foo
destination
└── bar

그 다음에

$ cp -rv source destination
`source' -> `destination/source'
`source/foo' -> `destination/source/foo'

하지만

% cp -rvT source destination
`source/foo' -> `destination/foo'

답변2

--no-target-directory소스 디렉토리를 복사하지 않으려면 다음을 사용할 수 있습니다.아래에원본 디렉터리를 복사하려는 기존 대상 디렉터리도착하다대상 디렉토리.

다음은 포함 여부에 따른 디렉터리 복사본의 예입니다 --no-target-directory.

$ mkdir a
$ touch a/b a/c
$ find
.
./a
./a/c
./a/b
$ cp -r a b       # b does not exist; becomes copy of a
$ find
.
./b
./b/b
./b/c
./a
./a/c
./a/b
$ rm -r b
$ mkdir b
$ cp -r a b       # b already exists; a is copied *underneath* it
$ find
.
./b
./b/a
./b/a/b
./b/a/c
./a
./a/c
./a/b
$ rm -r b
$ mkdir b
$ cp -r --no-target-directory a b     # b already exists; becomes copy of a
$ find
.
./b
./b/b
./b/c
./a
./a/c
./a/b

/.다음과 같이 소스 디렉터리 이름 뒤에 슬래시 점을 추가하면 동일한 효과를 얻을 수 있습니다 . cp -r a/. b소스 디렉터리 복사a 도착하다 b설마아래에 b.

위의 두 방법 모두 "원본 디렉터리의 내용을 기존 대상 디렉터리에 복사하기만 하면 된다"는 것과는 다릅니다. 왜냐하면 보존할 시간과 권한을 요청하면 기존 대상 디렉터리가 원본 디렉터리의 시간과 권한을 얻게 되기 때문입니다. 예(불필요한 정보를 제거하도록 편집됨):

$ find . -ls
drwx------   Oct 13 13:31 ./b         # note date and permissions
drwxr-xr-x   Jan  1  2013 ./a         # note date and permissions
-rw-r--r--   Oct 13 13:23 ./a/c
-rw-r--r--   Oct 13 13:23 ./a/b
$ cp -rp --no-target-directory a b    # preserve mode and timestamps
$ find . -ls
drwxr-xr-x   Jan  1  2013 ./b         # note copied date and permissions
-rw-r--r--   Oct 13 13:23 ./b/b
-rw-r--r--   Oct 13 13:23 ./b/c
drwxr-xr-x   Jan  1  2013 ./a
-rw-r--r--   Oct 13 13:23 ./a/c
-rw-r--r--   Oct 13 13:23 ./a/b

콘텐츠 전용 복사본은 소스 디렉터리의 스키마나 타임스탬프를 대상 디렉터리로 전송하지 않습니다.

답변3

아래는 어떻습니까?

$ cp -rvT Dir_1 Dir_2
‘Dir_1/File_3.txt’ -> ‘Dir_2/File_3.txt’
‘Dir_1/File_1.txt’ -> ‘Dir_2/File_1.txt’
‘Dir_1/File_2.txt’ -> ‘Dir_2/File_2.txt’
$ cp -rv Dir_1 Dir_2
‘Dir_1’ -> ‘Dir_2/Dir_1’
‘Dir_1/File_3.txt’ -> ‘Dir_2/Dir_1/File_3.txt’
‘Dir_1/File_1.txt’ -> ‘Dir_2/Dir_1/File_1.txt’
‘Dir_1/File_2.txt’ -> ‘Dir_2/Dir_1/File_2.txt’

그래서 그것은 단지 글쓰기 방식이 다를 뿐입니다 cp Dir_1/* Dir_2/. 그러나 Dir_1의 루트 디렉터리에 있는 숨겨진 파일을 캡처하는 반면 단순 cp *.

$ touch Dir_1/.Hidden_File_{1,2,3}.txt
$ cp -rv Dir_1/* Dir_2
cp: No match.
$ cp -rvT Dir_1 Dir_2
‘Dir_1/.Hidden_File_2.txt’ -> ‘Dir_2/.Hidden_File_2.txt’
‘Dir_1/.Hidden_File_3.txt’ -> ‘Dir_2/.Hidden_File_3.txt’
‘Dir_1/.Hidden_File_1.txt’ -> ‘Dir_2/.Hidden_File_1.txt’

관련 정보