약 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
발생합니다 . 그러면 파일이 저장됩니다.mv
2020-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
도움이 될 수 있는 의견(아래)의 일부 정보:
mv
GNU와 함께 사용 하면-t target
디렉터리가 아니면 실패합니다. 한 번에 여러 파일 이동을target
사용할 수 있습니다 (이렇게 하면 작업 속도도 빨라집니다).-exec mv -t /opt/alfresco/archived/2020-01-07 {} +
find
GNU를
mv
와 함께 사용 하면-n
기존 파일 덮어쓰기를 거부합니다.그 중 어느 것도 표준이
-t
아니지만-n
(macOS와 FreeBSD-n
에도 표준이 있지만) 시스템 간에 이식할 필요가 없는 스크립트에서 이를 사용하는 것을 막을 수는 없습니다.