49GB 디렉토리를 잘못된 파일 경로로 "mv"했습니다. 파일을 원래 상태로 복원할 수 있습니까?

49GB 디렉토리를 잘못된 파일 경로로 "mv"했습니다. 파일을 원래 상태로 복원할 수 있습니까?

나는 (글쎄, 나는가지다) 목차:

/media/admin/my_data

크기는 약 49GB이며 수만 개의 파일이 포함되어 있습니다. 이 디렉터리는 활성 LUKS 파티션의 마운트 지점입니다.

디렉토리 이름을 다음으로 바꾸고 싶습니다.

/media/admin/my_data_on_60GB_partition

당시에는 깨닫지 못했지만 홈 디렉터리에서 명령을 실행하고 있었기 때문에 결국 다음을 수행하게 되었습니다.

~% sudo mv /media/admin/my_data my_data_on_60GB_partition

그런 다음 프로그램은 내용을 새 디렉토리로 이동 mv하기 시작합니다 ./media/admin/my_data~/my_data_on_60GB_partition

Ctrl+를 사용하여 C명령을 취소했으므로 이제 여러 개의 파일이 여러 디렉터리로 분리되어 있습니다.

~/my_data_on_60GB_partition    <---  about 2GB worth files in here

그리고

/media/admin/my_data           <---- about 47GB of orig files in here    

새 디렉토리 ~/my_data_on_60GB_partition와 일부 하위 디렉토리는 루트가 소유합니다. 나는 프로그램이 먼저 파일을 루트로 복사한 다음 전송 후 내 사용자 계정으로 반환해야 한다고
가정합니다 .mvchown

다소 오래된 디렉터리/파티션 백업이 있습니다.
내 질문은,이동된 여러 파일을 안정적으로 복구할 수 있습니까?

즉, 다음을 실행할 수 있습니다.

sudo mv ~/my_data_on_60GB_partition/*  /media/admin/my_data

아니면 파일이 손상되거나 부분적으로 손상되었을 수 있으므로 복구 시도를 포기해야 합니까?

  • 운영 체제 - 우분투 16.04
mv --version  
mv (GNU coreutils) 8.25

답변1

파일 시스템 간에 파일을 이동할 때 mv파일은 복사가 완료될 때까지 삭제되지 않으며 파일을 순차적으로 처리합니다. (원래 각 파일을 순차적으로 복사한 다음 삭제한다고 말했지만 보장되지는 않습니다. 적어도 GNU mv복사본은 삭제됩니다. 파일당)명령줄 매개변수차례로, 그리고POSIX는 이 동작을 지정합니다). 따라서 대상 디렉토리에는 최대 하나의 불완전한 파일이 있지만 원본 파일은 여전히 ​​소스 디렉토리에 있습니다.

콘텐츠를 다시 이동하려면 아무 것도 덮어쓰지 않도록 -i플래그 를 추가하세요.mv

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

(복구할 숨겨진 파일이 없다고 가정 ~/my_data_on_60GB_partition/) 또는 더 나은 방법(발견한 내용을 고려하면 삭제 대기 중인 파일이 많을 수 있음) 해당 -n플래그를 추가하여 mv아무것도 덮어쓰지 않지만 이에 대한 질문은 받지 않습니다. 그것:

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/

플래그를 추가하여 -v수행 중인 작업을 확인할 수도 있습니다.

POSIX 호환 모든 것과 마찬가지로 mv원래 디렉토리 구조는 그대로 유지되어야 하므로 이를 확인하고 간단히 삭제할 수 있습니다 /media/admin/my_data. (그러나 일반적으로 이 mv -n변형은 안전한 접근 방식이라고 생각합니다. 다음 mv을 포함하여 모든 형식적인 을 처리합니다.예를 들어 mv /media/admin/my_data/* my_data_on_60GB_partition/.)

일부 권한을 복원해야 할 수도 있습니다.모두and를 사용 chown하거나 and chmod를 사용하여 백업에서 복원하세요 getfaclsetfacl(감사합니다.카츠라 사토~을 위한상기시키다).

답변2

Stephen Kitt의 답변을 얻고 이 명령을 잠재적인 해결책으로 논의한 후:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

나는 무슨 일이 일어나고 있는지 이해할 때까지 실행을 보류하기로 결정했으며 이 답변은 내가 발견하고 수행한 작업을 설명합니다.

Gnu를 사용하여 mv파일을 대상에 복사한 다음 복사 작업이 성공한 경우에만 원본 파일을 삭제합니다.
하지만 이 시퀀스가 ​​한 번에 한 파일씩 실행되는지 확인하고 싶습니다 mv. 그렇다면 원본 폴더 내용이 두 부분으로 깔끔하게 절단되어 한 부분은 대상으로 전송되고 다른 부분은 여전히 ​​소스에 남아 있습니다. 그리고 두 디렉터리 사이에 공통적으로 복사하는 동안 중단된 파일이 있을 수 있으며 형식이 잘못되었을 수 있습니다.

두 디렉토리 사이에 공통된 파일을 찾기 위해 다음을 실행했습니다.

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237

이 결과는 소스 디렉터리와 대상 디렉터리 모두에 동일한 파일의 인스턴스가 14,237개 있다는 것을 보여 주었습니다. 이는 파일을 수동으로 검사하여 확인했습니다. 예, 두 디렉터리 모두에 동일한 파일이 많이 있었습니다. 이는 mv많은 양의 파일을 복사한 후에만 소스 파일을 삭제한다는 의미입니다. 명령 표시 info에서 빠른 검색mv

먼저 mv요청된 디렉터리와 파일을 복사하는 동일한 코드 중 일부를 사용한 cp -a다음 (복사가 성공했다고 가정하고) 원본 파일을 삭제합니다. 복사에 실패하면 대상 파티션에 복사된 부분이 삭제됩니다.

명령을 실행하지 않았지만 실행을 시도한 것 같습니다.

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

이것-i 덮어쓰기 전 팁14,000회 이상 트리거될 수 있습니다.

그런 다음 새로 생성된 디렉터리에 파일이 몇 개 있는지 확인하세요.

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238

따라서 새 디렉터리에 총 14238개의 일반 파일이 있고 14237개의 파일이 소스에 동일한 원본 파일이 있는 경우 새 디렉터리에는 해당하는 동일한 파일이 없는 파일이 하나만 있다는 의미입니다. 원천. 파일이 무엇인지 확인하기 위해 소스 방향으로 rsync를 실행했습니다.

~% sudo rsync -av --dry-run my_data_on_60GB_partition/ /media/admin/my_data
sending incremental file list
./
Education_learning_reference/
Education_learning_reference/Business_Education/
Education_learning_reference/Business_Education/Business_education_media_files/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/018 business plans-identifying main KPIs.flv

sent 494,548 bytes  received 1,881 bytes  330,952.67 bytes/sec
total size is 1,900,548,824  speedup is 3,828.44 (DRY RUN)

빠른 검사 결과 원본과 대상 모두에 존재하는 잘못된 파일(대상 파일 = 64MB, 원본 파일 = 100MB)이라는 것이 확인되었습니다. 파일과 해당 디렉터리 계층 구조는 여전히 루트의 소유이며 원래 권한은 복원되지 않았습니다.

결론적으로:

  • 도착하지 않은 모든 파일은 mv여전히 ​​원래 위치로 돌아갑니다(분명히).
  • 완전히 복사된 모든 파일은 mv여전히 ​​소스 디렉터리에 원본 복사본을 가지고 있습니다.
  • 부분적으로 복사된 파일만 소스 디렉터리에 원본 파일을 그대로 유지합니다.

즉, 모든 원본 파일은 그대로 유지되며 이 경우 해결책은 새 디렉터리를 삭제하는 것입니다!

답변3

나는 어떤 사람들이 "xargs"를 병렬로 실행하기 위해 혼합에 포함시키고 싶은 유혹을 받을 수도 있다는 점을 언급하고 싶다고 생각했습니다. 이것은 나를 흥분시키고 위의 rsync 솔루션을 정말 좋아합니다.

이동 및 복사되는 파일 시스템 콘텐츠와 원본 파일이 삭제되는 경우 VFS와 기본 파일 시스템은 삭제 단계를 수행하기 전에 조정하여 각 파일의 원자성을 보장합니다. 따라서 대상 파일이 완전히 기록되기 전에 중단되더라도 VFS의 모든 잠금은 매우 엄격하여 병렬 상황에서도 임의의 데이터 인터리빙과 같은 문제를 방지합니다. (저는 Linux VFS 및 NFS4에 대해 조사했습니다)

"xargs"를 혼합에 추가하면 여러 파일이 전송되기 때문에 이중 온전성 검사 단계가 골치 아픈 일이 될 수 있습니다. 더 많은 시스템 수준 스크립트가 있었으면 좋겠습니다. 저에게 정말 좋은 알림이에요!

거미줄에 좋고 다시 rsync를 좋아하게 만드는 이 질문이 마음에 듭니다. 건배!

관련 정보