여러 디렉터리의 이름을 일괄적으로 변경하려고 하다가
rename 's/foo/barr/g' *
실수로 rename( ) 대신 mv를 입력했는데 mv 's/foo/bar/g' *
, 이는 디렉터리가 지워지는 것처럼 보였습니다. 그러나 ls *
원래 존재했던 모든 파일이 표시됩니다. 무엇을 제공합니까? 아직도... 어딘가에 있나요? ls
단독 또는 이전과 같이 전체 디렉토리 목록 ls -a
만 표시합니다 . ls *
그냥 포인터를 읽으시겠습니까? 쉽게 회복될까요?
답변1
에서는 쉘에 의해 현재 작업 디렉토리의 어휘 순서에 따라 숨겨지지 않은 모든 파일 또는 디렉토리의 이름으로 확장됩니다 mv 's/foo/bar/g' *
.*
그럼 , , , , ...를 사용해서 전화를 걸어 mv
볼까요 ?mv
s/foo/bar/g
afile
bfile
cfile
가능한 결과는 다양합니다.
- GNU와 같은 시스템을 사용하는 경우
--
옵션의 끝을 표시하는 것을 잊어버렸기 때문에 기본적으로mv
GNU는 해당 목록의 파일이 호출되면 옵션이 아닌 인수 뒤에 옵션을 허용합니다. 파일은 상위 디렉터리로 이동됩니다.-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-directory
ls *
ls that-directory
ls
that-directory
that-directory
이러한 파일 중 일부가 이동된 파일(예: a foo
와 that-directory/foo
이전에 모두 존재하는 파일)로 덮어쓴 경우 프로세스에서 일부 파일이 손실될 수 있습니다.
that-drectory
그렇지 않은 경우 파일을 현재 작업 디렉터리 로 다시 이동하여 파일을 복원할 수 있습니다 .
예를 들어 이 명령을 실행한 지 10분이 지나지 않았다면 zsh
다음을 수행할 수 있습니다.
mv that-directory/*(cm-10) .
ctime이 10분 미만인 파일을 현재 작업 디렉터리로 다시 이동합니다.