쉘 명령에서 디렉토리 이름 뒤의 슬래시(/)

쉘 명령에서 디렉토리 이름 뒤의 슬래시(/)

여기에 작은 문제가 있습니다.

두 개의 파일 이 있고 filea이라고 fileb말하면mv filea fileb

  • 삭제fileb
  • filea다음으로 이름 바꾸기fileb

따라서 두 개의 디렉토리가 있고 , dira라고 말하면dirbmv dira dirb

  • 이사하다 (될 것이다 dira)dirbdirb/dira

두 경우 모두 알림이나 메시지가 없다는 점을 확인하면 이는 매우 일관성이 없는 것 같습니다. 내 생각 에는 콘텐츠로 덮어써야 mv dira dirb한다고 생각합니다 (또는 이름이 지정된 디렉터리 아래 두 디렉터리를 병합 ).dirbdiradirb

슬래시가 있는 디렉터리 이름(예: dira/)은 디렉터리로 처리되고 슬래시가 없는 이름(예: dira)은 파일로 처리된다는 내용(물론 어느 정도)을 읽은 기억이 납니다. 어쨌든 이제 슬래시를 사용하여 쉘(zsh 및 아마도 bash)이 내 디렉토리 표기법을 존중하기를 원합니다. 이를 강제할 수 있는 터미널 옵션이 있습니까?

명확히 하기 위해 이것이 내가 원하는 동작입니다.

  • mv dira dirb결과 dirb가 콘텐츠로 덮어쓰여집니다.dira
  • mv dira dirb/결과는 (에서 ) dira로 이동 됩니다.dirbdirb/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

전체적으로 보다 일관된 동작을 얻는 솔루션은 다음과 같습니다(적어도 mvcp명령 사용).

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 DESTSOURCEcp-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'

관련 정보