mv가 디렉토리를 바꾸지 않고 디렉토리로 이동하도록 결정하는 방법은 무엇입니까?


18

디렉토리가 있다고 가정 해보십시오 /hello.

그런 다음 mv /hello /hello2.

내가 이사 /hello하고 /hello2/hello있습니까? 아니면 내가 이사 /hello하고 /hello2있습니까?

이와 같은 작업을 수행하면 일관성이없는 결과가 나타납니다.


1
어떤 경우에 결과가 일치하지 않습니까? 대상 디렉토리가 존재할 때마다 대상 디렉토리로 이동하고 그렇지 않으면 이름이 바뀝니다.
jmathew

일관성이 없습니다. 동일한 명령이 동일한 작업을 수행해야합니다. 그것은 명령이 모호하다는 것을 의미합니다.
user4951

문맥 내에서 일관되게 작동하기 때문에 실제로 일관성이 없습니다. 혼란 스럽지만 더 많이 생각할 수는 있지만 모든 시나리오에서 작동하려면 명령이 그런 식이어야합니다.
jmathew

오히려 그것이 그것이 디자인되고 논리적 인 방법이라고 말하고 싶습니다. mv파일과 함께 사용 하면 같은 일을합니다. 이름 바꾸기. mv그러나 디렉토리와 함께 하나의 mv명령 때문에 하위 디렉토리로 전체 디렉토리를 삭제 하는 것은 좋지 않습니다. 안전한. 로 이동됩니다 test1/test2. 그러나 여전히 달성 alias하려면 주어진 매개 변수가 디렉토리인지 확인한 다음 rm -rf 디렉토리를 수행하고 mv명령을 사용하지만 자신의 위험에 따라 사용하십시오.
harish.venkat

귀하의 예는 "이런 일을하는 것 같습니다"에 근거하여 과거에 일어난 일을 잘못 기억 한 것에 근거한 것 같습니다. 두 경우 /hello와는 /hello2디렉토리이며, 그때 나는 것으로 나타났습니다 cp /hello /hello2일관성의 하나입니다. 후행 슬래시의 조합에 따라 때때로 내용이 /hello에 복사되고 /hello2때로는 디렉토리 자체가 복사됩니다.
Izkata

답변:


16

mv a b디렉토리 또는 디렉토리에 대한 심볼릭 링크 인 경우 이동 a을 시도합니다 . 그렇지 않으면, 이름을 변경 (또는 복사 및 다른 파일 시스템의 경우 삭제)됩니다 에 .bbab

파일을 디렉토리로 이동하는 일관된 결과를 얻으려면 다음을 수행하십시오.

mv file dir/

또는

mv file dir/.

경우 dir존재하지 않는 오류를 얻을 수 있습니다, 그것은 이름을 변경하지 않습니다 filedir.

반면에 rename대상 파일이 디렉토리로 존재하는지 여부를 걱정하지 않고 GNU mv를 사용하여 다음 작업을 수행 할 수 있습니다.

mv -T file dest

이 경우 디렉토리가 if이면 file이동되지 않습니다 . 두 경우, 그리고이 디렉토리는 다음과 비어, 로 이름이 변경됩니다 (원래는 제거). 둘 다 디렉토리이고 비어 있지 않으면 불평합니다.destdestfiledestdestfiledestdestdestmv -T

file및 디렉토리 dest아닌 경우 (및 디렉토리에 대한 심볼릭 링크를 포함하는 심볼릭 링크를 포함하는 경우) 와 file이름이 바뀌고 dest(에 대한 쓰기 권한이없는 경우 프롬프트가 dest표시됨) 원본 dest이 제거됩니다. 디렉토리에 대한 심볼릭 링크가있는 mv file dest경우에는 차이점이 있습니다 dest. 로 -T, file로 이름이 변경되고 dest,하지만하지 않고 -T, file가 가리키는 디렉토리로 이동합니다 dest.

그래서 요약하면, 후 mv -T file dest, 하나 file에 이름이 변경된 것 dest또는 오류 메시지 (또는 메시지)를 얻을 수 있습니다. 명령이 성공한 경우, 원본 dest이 이미 존재하는 경우 제거됩니다.


14

'/ hello2'라는 디렉토리가 이미 존재하는지 여부에 따라 달라집니다.

/ hello2가 존재하고 디렉토리 인 경우 이동은 항상 / hello를 / hello / hello2로 이동합니다.

/ hello2가 없으면 이동은 항상 / hello의 이름을 / hello2로 바꿉니다.

/ hello2가 존재하고 파일 인 경우 디렉토리가 아닌 'hello2'디렉토리를 'hello'디렉토리로 겹쳐 쓸 수 없습니다.


3

나는 이것을 시도했다

mkdir test1
mv -v test1 test2
output:`test1' -> `test2'
mkdir test1
mv -v test2 test1
output: `test2' -> `test1/test2'
touch test2
output:mv: cannot overwrite non-directory `test2' with directory `test1'

이것이 모든 것을 설명하기를 바랍니다. -v상세 모드입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.