이름을 바꾸려고 하면 파일이 손실될 수 있습니다.

이름을 바꾸려고 하면 파일이 손실될 수 있습니다.

방금 a라는 스크립트를 생성 하고 실행되도록 myscripta를 실행했습니다 . chmod +x myscript실행을 시도했는데 확장 프로그램을 myscript잊어버렸다는 것을 깨달았습니다 ..sh

따라서 내 셸에서 다음 명령을 실행합니다 bash.

mv myscript *.sh

...짜잔, 파일이 더 이상 존재하지 않습니다. 이름으로 검색해서 지난 1시간 동안 수정된 모든 파일 목록을 얻었으나 파일을 찾을 수 없습니다. 어디로 갔나요? 수리해야 할 다른 손상이 있습니까?

답변1

*.sh현재 디렉터리의 패턴과 일치하는 적어도 하나의 디렉터리 또는 정확히 하나의 파일이 있을 수 있습니다 .

  1. 디렉터리인 경우 해당 디렉터리의 파일이 myscript손상되지 않은 것을 확인할 수 있습니다. 예

    mkdir dir.sh
    mv myscript *.sh
    

    mv명령은 쉘 확장되어 mv myscript dir.sh파일이 해당 디렉토리로 이동됩니다.

  2. 파일인 경우 해당 파일이 있음을 알 수 있습니다.교체됨그리고 myscript. 예

    touch file.sh
    mv myscript *.sh
    

    mv명령은 셸에 의해 확장되고 mv myscript file.sh파일 이름이 바뀌어 파일에 file.sh포함될 수 있는 이전 내용을 덮어씁니다.

  3. 현재 디렉토리에 일치하는 파일과 디렉토리가 있는 경우 *.sh세트의 마지막 항목(로케일에 따른 영숫자 순서)이 파일인지 디렉토리인지에 따라 달라집니다. 모든 경우에 쉘은 mv myscript file1.sh file2.sh lastdir.sh또는와 같은 와일드카드 문자를 확장합니다 mv myscript dir.sh file.sh.

    • 디렉토리가 마지막 항목인 경우 셸과 일치하는 모든 항목은 해당 디렉토리로 이동됩니다.
    • 파일이 마지막 프로젝트인 경우 mv여러 프로젝트의 이름을 단일 대상으로 바꿀 수 없으므로 명령이 오류와 함께 실패합니다. (오류를 신고하지 않으셔서 mv이런 상황은 발생하지 않았던 것 같습니다.)
  4. 마지막으로, 현재 디렉토리에 패턴과 일치하는 항목이 없으면 *.sh쉘은 패턴을 유지하고 mv이를 리터럴로 전달할 수 있습니다. 이 경우 명령은 파일 이름을 첫 번째 문자로 별표가 포함된 mv리터럴 문자열로 바꿉니다 .*.sh

나는 작업 #2가 무슨 일이 일어나고 있는지 식별할 가능성이 가장 높으며 패턴과 일치하는 파일의 원래 내용을 잃게 될 것이라고 생각합니다 *.sh.

관련 정보