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


58

나는 (물론, 내가 가진 디렉토리) :

/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

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

  • OS-우분투 16.04
mv --version  
mv (GNU coreutils) 8.25

36
당황 Control-Z하지 않고 타자를 치기 (일시 정지) 하는 습관을들이십시오 Control-C. 이 경우 당시에 어떤 파일이 전송되었는지 확인할 수 있으므로 부분적으로 만 복사 된 파일을 알 수 있습니다. 그런 다음 진행 방법을 침착하게 결정할 수 있습니다. kill -stoptty에없는 프로세스에 사용하십시오 .
meuh

1
2GB + 47GB = 60GB ???
tbodt

7
@tbodt (2GB + 47GB) < 60GB. 파티션 용량은 60GB, 폴더 크기 및 내용은 49GB입니다.
the_velour_fog

답변:


87

파일 시스템간에 파일을 이동할 때 파일 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/ .)

아마도 일부 권한을 복원해야 할 것입니다. 당신은 그렇게 할 수 한꺼번에 사용 chown하고 chmod, 또는 사용하여 백업에서 복원 getfacl하고 setfacl(덕분에 사토 가쓰라 에 대한 알림 ).


Stephen Kitt에게 감사합니다. 큰 도움이되었습니다! find권한을 찾고 설정 하는 데 사용할 수 있습니다 . 새 디렉토리에는 파일 이름에 공백이 있지만 숨겨진 파일은없는 많은 파일이 있습니다. 명령의 glob가 sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/단어 분할 문제없이 파일 이름을 확장 한다고 생각 합니까? 대안으로 sudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/파일 경로를 공백으로 처리 할 수 있다고 생각할 수 있습니까?
the_velour_fog

6
확실하게 말하면 OP와 같은 일이 발생하면 rsync대신 사용 하므로 모든 파일의 무결성을 검사합니다. 그러나 내가 필요하지 않다는 것을 아는 것이 좋습니다.
Hauleth

1
@the_velour_fog globbing은 파일 이름의 공백을 문제없이 처리합니다.
Stephen Kitt

5
나는 좋겠 su command mv -i ...(또는 su /bin/mv -i ...), 대신 sudo mv -i ...,) 경우 않습니다 "MV"기능 "MV -f"만든 일부 (이상한) 관리 시스템 레벨에서 (즉,은 / etc / 프로필 또는 시스템 전체 파일) .. command something : 같은 이름의 함수 나 별칭이 아닌 명령을 시작합니다. (예를 들어, 하나는 (매우!) 운이 좋지 않고 function mv { /bin/mv -f -- "$@" }항상 소스 파일에 (매우, 매우 나쁜!) 있을 수 있으며 "rm -i something"은 아무 것도 묻지 않습니다 (그리고 그냥 "-i "파일이 존재하지 않습니다!) ... [그런 것들을 보았습니다 ... 떨림 ]
Olivier Dulac

3
@OlivierDulac-표준 프로그램과 동일한 이름을 가진 별칭이나 스크립트를 사용하는 것이 좋지 않은 이유의 완벽한 예입니다.
Joe

19

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완전히 복사 한 모든 파일 은 여전히 ​​원본 디렉토리에 원본이 있습니다.
  • 부분적으로 만 복사 된 파일은 여전히 ​​원본 디렉토리에 원본이 있습니다.

다시 말해서 모든 원본 파일은 그대로 유지되었으며이 경우 해결책은 단순히 새 디렉토리를 삭제하는 것입니다!


와우 ... 나는 대답을 업데이트했는데 -n, 일반적인 경우에 더 좋을 것입니다. mv소스 코드를 확인하면 한 번에 하나의 인수로 소스를 삭제합니다.
Stephen Kitt

@StephenKitt 아 좋은. mv소스에서 삭제가 언제인지 궁금 합니다. 그래서 명령이 mv foo bar baz움직일 것입니다 foo위해 baz/foo 다음 원본을 삭제 foo한 후 이동 barbaz/bar..?
the_velour_fog

그렇습니다. 실제로 POSIX가 지정하는 것입니다 (기본적으로 소스 인수에 영향을 미치는 모든 오류는 전체 소스 계층 구조를 그대로 유지합니다).
Stephen Kitt

diff를 사용하여 하나의 미완성 파일도 찾을 수 있다고 생각합니다.
StarWeaver

1
바이너리 파일을 비교 하기 cmp보다는 사용해야 diff합니다. 또한 위의 설명은 다른 파일 시스템간에 파일을 이동할 때만 의미가 있습니다. 동일한 파일 시스템 내에서 파일을 이동할 때 복사가 필요하지 않습니다.
사토 카츠라

4

방금 일부 사람들이 'xargs'를 믹스로 던져서 사물을 병렬로 실행하려는 유혹을받을 수 있다고 언급했습니다. 그것은 나에게 willies를 제공하고 나는 위의 rsync 솔루션을 정말로 좋아합니다.

이동 및 복사에 관한 파일 시스템과 원본이 정확히 삭제 될 때 VFS와 기본 파일 시스템은 해당 삭제 단계에 도달하기 전에 파일 별 원 자성을 보장하도록 조정됩니다. 따라서 대상 파일이 완전히 작성되기 전에 중단 되더라도 VFS의 모든 잠금은 매우 엄격하며 병렬 경우에도 임의의 데이터 인터리빙과 같은 것을 방지합니다. (Linux VFS 및 NFS4 관련 작업을했습니다)

믹스에 'xargs'를 추가하면 이중 파일 검사 단계가 어려울 수 있습니다. 더 많은 시스템 레벨 스크립팅을 원했습니다. 나에게 좋은 알림!

질문을 좋아하고 거미줄에 좋으며 다시 rsync를 좋아하게 만듭니다. 건배!


1
파일 이름에 공백이 포함 된 경우 문제는 말할 것도 없습니다.
와일드 카드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.