이름을 바꾸는 대신 mv를 사용하면 파일이 사라집니다.

이름을 바꾸는 대신 mv를 사용하면 파일이 사라집니다.

여러 디렉터리의 이름을 일괄적으로 변경하려고 하다가 rename 's/foo/barr/g' * 실수로 rename( ) 대신 mv를 입력했는데 mv 's/foo/bar/g' *, 이는 디렉터리가 지워지는 것처럼 보였습니다. 그러나 ls *원래 존재했던 모든 파일이 표시됩니다. 무엇을 제공합니까? 아직도... 어딘가에 있나요? ls단독 또는 이전과 같이 전체 디렉토리 목록 ls -a만 표시합니다 . ls *그냥 포인터를 읽으시겠습니까? 쉽게 회복될까요?

답변1

에서는 쉘에 의해 현재 작업 디렉토리의 어휘 순서에 따라 숨겨지지 않은 모든 파일 또는 디렉토리의 이름으로 확장됩니다 mv 's/foo/bar/g' *.*

그럼 , , , , ...를 사용해서 전화를 걸어 mv볼까요 ?mvs/foo/bar/gafilebfilecfile

가능한 결과는 다양합니다.

  • GNU와 같은 시스템을 사용하는 경우 --옵션의 끝을 표시하는 것을 잊어버렸기 때문에 기본적으로 mvGNU는 해당 목록의 파일이 호출되면 옵션이 아닌 인수 뒤에 옵션을 허용합니다. 파일은 상위 디렉터리로 이동됩니다.-t..mv
  • *하나의 파일로만 확장 하면 가 됩니다 mv s/foo/bar/g that-file. that-file디렉토리 유형인 경우 s/foo/bar/g해당 디렉토리로 파일을 이동합니다. 그렇지 않은 경우 이름을 해당 파일로 바꿉니다. 나는 s/foo/bar/g그것이 존재할 것이라고 기대하지 않기 때문에 ( that-file존재한다면 오류가 발생합니다) 오류가 발생합니다.
  • 여러 파일로 확장되는 경우 *마지막 if 유형이 아닌 경우목차, 오류가 발생합니다. 디렉터리 유형인 경우 모든 파일이 해당 디렉터리로 이동됩니다.

파일이 표시된다는 사실은 ls *귀하가 위의 후자 상황에 있음을 나타냅니다. 즉, 모든 파일이 하나의 디렉토리로 이동되어 ls표시되며 that-directory이제 다른 모든 파일을 해당 디렉토리로 이동한 후에만 확장되고 *해당 디렉토리의 내용이 나열되도록 요청하도록 변경됩니다.that-directoryls *ls that-directorylsthat-directory

that-directory이러한 파일 중 일부가 이동된 파일(예: a foothat-directory/foo이전에 모두 존재하는 파일)로 덮어쓴 경우 프로세스에서 일부 파일이 손실될 수 있습니다.

that-drectory그렇지 않은 경우 파일을 현재 작업 디렉터리 로 다시 이동하여 파일을 복원할 수 있습니다 .

예를 들어 이 명령을 실행한 지 10분이 지나지 않았다면 zsh다음을 수행할 수 있습니다.

mv that-directory/*(cm-10) .

ctime이 10분 미만인 파일을 현재 작업 디렉터리로 다시 이동합니다.

관련 정보