여기에 작은 문제가 있습니다.
두 개의 파일 이 있고 filea
이라고 fileb
말하면mv filea fileb
- 삭제
fileb
filea
다음으로 이름 바꾸기fileb
따라서 두 개의 디렉토리가 있고 , dira
라고 말하면dirb
mv dira dirb
- 이사하다 (될 것이다
dira
)dirb
dirb/dira
두 경우 모두 알림이나 메시지가 없다는 점을 확인하면 이는 매우 일관성이 없는 것 같습니다. 내 생각 에는 콘텐츠로 덮어써야 mv dira dirb
한다고 생각합니다 (또는 이름이 지정된 디렉터리 아래 두 디렉터리를 병합 ).dirb
dira
dirb
슬래시가 있는 디렉터리 이름(예: dira/
)은 디렉터리로 처리되고 슬래시가 없는 이름(예: dira
)은 파일로 처리된다는 내용(물론 어느 정도)을 읽은 기억이 납니다. 어쨌든 이제 슬래시를 사용하여 쉘(zsh 및 아마도 bash)이 내 디렉토리 표기법을 존중하기를 원합니다. 이를 강제할 수 있는 터미널 옵션이 있습니까?
명확히 하기 위해 이것이 내가 원하는 동작입니다.
mv dira dirb
결과dirb
가 콘텐츠로 덮어쓰여집니다.dira
mv dira dirb/
결과는 (에서 )dira
로 이동 됩니다.dirb
dirb/dira
나와 같은 생각을 가진 사람이 있나요? 아니면 나만 이상한 걸까?
답변1
예, 이는 GNU 도구들 사이에서도 약간 일관성이 없습니다.
제안의 한 가지 문제점은 비어 있지 않은 디렉토리를 삭제할 수 없다는 것입니다. 그 외에는 -T
(GNU 영역에서는 어쨌든) 대략적으로 원하는 것입니다(첫 번째 경우).
$ ls dira/ dirb/
dira/:
a
dirb/:
b
$ mv -iT dira/ dirb/
mv: overwrite `dirb/'? y
mv: cannot move `dira/' to `dirb/': Directory not empty
$ rm dirb/b
$ mv -iT dira/ dirb/
mv: overwrite `dirb/'? y
$ ls dira/ dirb/
ls: cannot access dira/: No such file or directory
dirb/:
a
답변2
dira에서 dirb로 모든 것을 이동하려면 다음을 실행할 수 있습니다 mv dira/* dirb
.
내 HP-UX의 mv 매뉴얼 페이지에 따르면.
The mv command moves:
+ One or more directory subtrees (directory1, [directory2, ...]) to a new or existing directory (dest-directory).
답변3
전체적으로 보다 일관된 동작을 얻는 솔루션은 다음과 같습니다(적어도 mv
및 cp
명령 사용).
move( mv
) 명령 의 경우
다음 옵션을 사용하면 좀 더 일관된 동작을 얻을 수 있습니다 -i
.
mv -i SOURCE DEST
filea
이는 이미 존재하는 데이터를 덮어쓸 때 경고를 표시하고 확인을 요청 fileb
하지만 다른 경우에는 그렇지 않습니다. 즉, 데이터가 손실될 경우에만 경고 및 확인 메시지를 받게 됩니다.
$ mv -i filea fileb
:
fileb
아직 존재하지 않는다면,filea
자동으로 이름이 다음으로 변경되었습니다.fileb
fileb
이미 존재하는 경우fileb
, 덮어쓰기 전에 확인 필요filea
$ mv -i dira dirb
:
dirb
아직 존재하지 않는다면,dira
자동으로 이름이 다음으로 변경되었습니다.dirb
dirb
이미 존재하는 경우,dira
조용히 이사했다dirb
영구적인 해결책은 별칭을 만드는 것입니다.$ alias mv='mv -i'
복사( cp
) 명령 의 경우
이 cp
명령 에도 -i
비슷한 옵션이 있습니다 . 그러나 이 옵션을 지정하지 않으면 모든 디렉터리가 무시되므로 마치 디렉터리 인 것처럼 cp SOURCE DEST
동작하지 않습니다 .mv -i SOURCE DEST
SOURCE
cp
-r
따라서 유사한 동작을 얻으려면 mv -i
다음 명령을 사용할 수 있습니다.
$ cp -ir SOURCE DEST
mv -i
이는 명령에 표시된 대로 비슷한 방식으로 파일과 디렉터리를 처리하여 덮어쓰기 전에 경고를 표시하고 확인을 요청합니다.
$ cp -ir filea fileb
:
fileb
아직 존재하지 않는다면,filea
자동으로 복사됩니다.fileb
fileb
이미 존재하는 경우fileb
, 복사본으로 덮어쓰기 전에 확인이 필요합니다.filea
$ cp -ir dira dirb
:
dirb
아직 존재하지 않는다면,dira
자동으로 복사됩니다.dirb
dirb
이미 존재하는 경우,dira
자동으로 복사됩니다.dirb
여기서 영구적인 해결책은 별칭을 만드는 것입니다.$ alias cp='cp -ir'