wget은 정규식을 전달한 파일에서만 반복됩니다.

wget은 정규식을 전달한 파일에서만 반복됩니다.

다음과 같이 ftp 디렉토리에서 wget을 재귀적으로 사용하고 싶습니다.

ftp://ftp.ensembl.org/pub/current_fasta/

여기에는 또 다른 2개의 디렉터리 수준이 포함되어 있습니다. 첫 번째 디렉터리에는 종 이름이 포함되고 두 번째 디렉터리에는 dna다음과 같이 이름이 포함됩니다. ftp://ftp.ensembl.org/pub/current_fasta/species_name/dna/

예를 들어, 그 중 하나에는 종_이름이 있습니다 homo_sapiens.

ftp://ftp.ensembl.org/pub/current_fasta/homo_sapiens/dna/

./dna/디렉토리에서 이름에 단어가 포함된 파일만 다운로드하고 싶고 toplevel단어가 포함된 파일은 다운로드하지 않으려고 합니다 _rm.toplevel.

species_name.fa.gz마지막으로 wget 재귀 명령을 사용하여 이러한 디렉터리의 모든 파일을 각각 where is species_namethe name of the parent 디렉터리 바로 앞에 있는 출력 파일로 다운로드하고 싶습니다 dna.

어떤 아이디어가 있나요?

답변1

와일드카드 패턴을 기반으로 파일과 디렉터리를 포함하거나 제외하도록 wget에 지시할 수 있습니다. 테스트되지 않음:

wget -R \
  -X '/*/?*dna,/*/pep' \
  -A '*toplevel*' -R '*_rm.toplevel*' \
  ftp://ftp.ensembl.org/pub/current_fasta/

FTP의 경우 wget은 복잡한 검색에 가장 적합한 도구가 아닙니다. Wget은 웹페이지의 링크를 따라가는 방법을 알고 있지만 이는 FTP와는 아무런 관련이 없습니다. FTP 사이트를 디렉토리로 마운트하는 것이 좋습니다AVFS,컬프트프프스아니면 다른 것퓨즈파일 시스템 및 사용 cp또는 rsyncAVFS 사용:

mountavfs
ls ~/.avfs/\#ftp:ftp.ensembl.org/pub/current_fasta/homo_sapiens

CurlFtpFS 사용:

mkdir ~/current_fasta
curlftpfs ftp://ftp.ensembl.org/pub/current_fasta/ ~/current_fasta
ls ~/current_fasta/homo_sapiens

쉘에서 파일을 복사하려면 다음을 수행하십시오.

for x in ~/.avfs/\#ftp:ftp.ensembl.org/pub/current_fasta/*/dna/*toplevel*; do
  case $x in *_rm.toplevel*) continue;; esac
  species=${x%/dna/*}; species=${species##*/}
  cp -p "$x" "$species.fa.gz"
done

또는 zsh에서:

autoload zmv
zmv -C '~/.avfs/\#ftp:ftp.ensembl.org/pub/current_fasta/(*)/dna/*toplevel*~*_rm.toplevel*' '$1.fa.gz'

답변2

사용할 수 있는 경우 lftp:

echo 'mirror --no-empty-dirs -I *toplevel* -X *_rm.toplevel* . .' | 
lftp ftp://ftp.ensembl.org/pub/current_fasta/
for folder in *; do
  mv $folder/dna/*toplevel* $folder.fa.gz
  rm -r "$folder"
done

관련 정보