wget이 전체 디렉토리 목록을 가져오지 못함

wget이 전체 디렉토리 목록을 가져오지 못함

나는 여기 저기 찾아다녔지만 내 문제에 대한 답을 찾지 못했습니다. 이것이 적절한 포럼인지는 확실하지 않지만 여기 누군가가 도움을 줄 수 있기를 바랍니다.

나는 최근까지 아무런 문제 없이 wget(FTP)을 사용하여 내 웹사이트를 내 로컬 HD에 백업해 왔습니다. 미러 옵션을 사용하는 것입니다. 최근 이미지를 보관하는 디렉터리가 호스팅 서비스에서 설정한 FTP 목록에 포함될 수 있는 항목 수 제한에 도달했습니다. 계정에 대한 SSL 액세스 권한이 없습니다.

원격 서버에서 스크립트를 실행하고 전체 디렉터리 목록(ls)을 파일로 가져와 로컬 컴퓨터에 다운로드할 수 있습니다.

목록 제한에 도달하기 전과 마찬가지로 이 파일을 wget에 공급하고 해당 파일을 내 로컬 드라이브에 미러링하도록 할 수 있습니까? wget에서 생성된 목록을 읽고 변경 및 추가된 파일을 확인하고 싶습니다. 제가 답변을 찾을 수 없었던 질문은 다음과 같습니다.

1) 필요한 정보를 생성하는 데 적합한 ls 명령은 무엇입니까? 현재는 실제 파일 이름만 가져오고 있지만 더 많은 파일 이름이 필요하다고 확신합니다.

2) 미러 옵션이 포함된 wget은 입력 파일에서 계속 작동합니까, 아니면 변경된 상태를 확인하지 않고 입력 파일의 모든 파일을 다운로드합니까? 나는 이 조합에 대한 정보를 전혀 찾지 못했습니다. 둘 중 하나만 찾았습니다. 나는 디렉토리의 전체 백업을 가져오는 것을 테스트하고 싶지 않습니다. 모든 데이터를 가져오는 데 대역폭과 시간이 낭비됩니다.

답변1

이렇게 할 수 있습니다. 유일한 문제는 다음에서 출력을 얻는 것입니다.ㅋㅋㅋ이는 원격 컴퓨터와 로컬 컴퓨터에서도 동일합니다. 내 ls에는 옵션이 있습니다 --시간 스타일=+%s이는 두 시스템 모두에서 일치해야 하는 에포크 이후 파일의 마지막 수정 시간(초)을 표시합니다. 나는 당신이 하나의 디렉토리에 대해서만 이 작업을 수행하기를 원한다고 가정합니다. 그렇지 않으면 find해당 명령이 있는 경우 더 적절할 것입니다.

원격에서 필요한 디렉토리의 ls를 파일로 수행합니다.

cd ... # cd to the directory to list
ls -l --time-style=+%s . >/tmp/listfile

로컬 컴퓨터에서 원격을 /tmp/listfilelocal 에 복사한 /tmp/listfile다음 다음을 사용하세요. 출력의 처음 4개 열을 억제하고 파일 크기, 날짜 및 파일 이름 목록을 정렬합니다. (나는 당신이 공백이 있는 파일 이름을 가지고 있을 것이라고 가정하고 있습니다. 따라서 기괴한 awk입니다).

awk '{$1="";$2="";$3="";$4="";print}' </tmp/listfile | sort >/tmp/a

미러링된 디렉터리에서 동일한 목록을 얻습니다.

cd ... # cd to same directory we listed remotely
ls -l --time-style=+%s . | awk '{$1="";$2="";$3="";$4="";print}' | sort >/tmp/b

두 개의 정렬된 목록을 비교하고 다음과 같은 줄을 삭제합니다. 통신. 크기 및 날짜 열(그리고 /tmp/a가 아닌 /tmp/b의 줄 시작 부분에 있는 탭과 2개의 열 간 공백)을 삭제하고 다음을 사용하여 중복된 파일 이름을 삭제합니다.유니크. (중복된 줄이 인접해 있으므로 다시 정렬할 필요가 없습니다.)

comm -3 /tmp/a /tmp/b | awk '{$1="";$2="";print substr($0,3)}' | uniq >/tmp/c

/tmp/c의 목록에는 새 파일, 크기나 타임스탬프가 다르거나 제거된 모든 파일이 있습니다. 각각을 wget에 전달하여 가져옵니다(여전히 적절한 디렉토리에 있음).

while read file
do  rm -f "$file"
    wget -N --no-directories ..../"$file" # non recursive single file to .
done </tmp/c

더 이상 이 디렉토리를 가져오지 않도록 wget 미러를 구성해야 합니다.

할 수 있다면 find ... -printf '%9s %T+ %p\n'미러 디렉토리의 맨 위에서 시작하여 이러한 종류의 기술을 사용하여 효과적으로 미러링을 직접 수행할 수 있습니다.

관련 정보