질문:를 사용하는 방법을 보여주기 위해 간단한 예가 필요합니다 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/dest
mv -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
-T
cp
wibble
wibble
cp
표 형식:
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’