파일을 디렉토리로 변경하는 방법은 무엇입니까? find+mv 이후 파일 손실

파일을 디렉토리로 변경하는 방법은 무엇입니까? find+mv 이후 파일 손실

약 2000개의 파일이 있는 디렉토리가 있습니다.
다음 명령을 실행하여 2000개의 파일을 대상 디렉터리로 이동했습니다.

find /opt/alfresco \
        -type f \( -iname \*.pdf -o -iname \*.xml \) \
        -exec mv {} /opt/alfresco/archived/2020-01-07  \; > /opt/alfresco/scripts/move.log

/그러나 대상 경로 끝에 a를 추가하는 것을 잊었습니다. 따라서 위 명령이 수행하는 작업은 이름이 있는 파일을 생성 2020-01-07하고 현재 읽을 수 없는 일부 바이너리 콘텐츠를 파일에 쓰는 것입니다. 내 파일 중 2000개도 사라졌습니다. 파일 2020-01-07크기는 220KB입니다. 하지만 이 2000개 파일의 총 크기는 약 1GB입니다.

2000개의 파일을 복구할 수 있는 방법이 있습니까? 아니면 이 파일을 2020-01-07디렉토리로 변환 2020-01-07하고 데이터를 다시 가져올 수 있는 방법이 있습니까 ?

답변1

대상 경로 끝에 슬래시를 추가하면 해당 디렉터리가 분명히 존재하지 않기 때문에 명령 오류가 /opt/alfresco/archived/2020-01-07발생합니다 . 그러면 파일이 저장됩니다.mv2020-01-07

/opt/alfresco/archived/2020-01-07기존 디렉터리인 경우(대상 경로 끝에 슬래시가 있는지 여부에 관계없이) 해당 디렉터리도 저장되며 파일은 해당 디렉터리로 이동됩니다(파일을 이동할 때 파일 이름 충돌이 여전히 문제가 될 수 있음). from 여러 디렉터리를 단일 디렉터리로 이동할 때). 이것이 당신이 원하는 것입니다. 당신이 잊어버린 것은 먼저 디렉토리를 생성하는 것입니다.

이제 디렉토리가 존재하지 않기 때문에 이 find명령이 수행하는 작업은 각각의 개별 XML 및 PDF 파일을 가져와서 이름을 로 바꾼 /opt/alfresco/archived/2020-01-07다음 다음 파일에 대해 동일한 작업을 계속 수행하여 이전 파일을 덮어쓰는 것뿐입니다.

파일은 /opt/alfresco/archived/2020-01-07지금마지막으로 발견된 XML 또는 PDF 파일find.

또한 find에서 명령을 실행하고 있으므로 /opt/alfresco해당 경로 아래에 있는 모든 PDF 또는 XML 파일(예: 아래 디렉터리에 있는 파일 /opt/alfresco/archived)은 동일한 운명을 맞이하게 됩니다.

이는 저지르기 쉬운 실수입니다. 아니요편리한백업에서 손실된 파일을 복구하는 것 외에도 손실된 파일을 복구하는 다른 방법이 있습니다.

매시간 데이터를 백업하지 않는다면 지금이 백업에 대해 생각해 볼 좋은 시기일 수 있습니다. 가급적 이면 외부 저장소나 최소한 외부 저장소에 개인 파일을 백업하는 것이 좋습니다 restic.borgbackup

다음 질문과 답변이 도움이 될 수 있습니다.

다음에 이 스크립트를 다시 작성할 때 archived하위 디렉터리를 무시하고 를 사용해야 할 수도 있습니다 mv -n -t. 또한 -print파일을 명시적으로 찾거나 사용해야 합니다 mv -v. find그렇지 않으면 해당 위치가 출력되지 않습니다.

find /opt/alfresco \
    -path /opt/alfresco/archived -prune -o \
    -type f \( -iname '*.pdf' -o -iname '*.xml' \) \
    -exec mv -n -t /opt/alfresco/archived/2020-01-07 {} + \
    -print >/opt/alfresco/scripts/move.log

도움이 될 수 있는 의견(아래)의 일부 정보:

  • mvGNU와 함께 사용 하면 -t target디렉터리가 아니면 실패합니다. 한 번에 여러 파일 이동을 target사용할 수 있습니다 (이렇게 하면 작업 속도도 빨라집니다).-exec mv -t /opt/alfresco/archived/2020-01-07 {} +find

  • GNU를 mv와 함께 사용 하면 -n기존 파일 덮어쓰기를 거부합니다.

  • 그 중 어느 것도 표준이 -t아니지만 -n(macOS와 FreeBSD -n에도 표준이 있지만) 시스템 간에 이식할 필요가 없는 스크립트에서 이를 사용하는 것을 막을 수는 없습니다.

관련 정보