FTP 일괄 다운로드 및 이름 바꾸기

FTP 일괄 다운로드 및 이름 바꾸기

첫째, 왜 이것을 시도해야 합니까? 날짜 "스탬핑"으로 파일을 단축하려면 일부 파일을 다운로드하고 이름을 바꿔야 하기 때문입니다. 원격 파일의 파일 이름은 매우 커서 변경할 수 없습니다(ftp는 아님).

다운로드해야 하는 각 파일에 대해 하나의 FTP 연결을 열지 않고 원격 FTP 서버에서 일부 파일을 일괄 다운로드하고 이름을 바꾸려고 합니다. 지금까지는 ftp 명령을 사용하여 nmap"N"으로 시작하고 ".TXT"로 끝나는 모든 파일의 이름을 "N_date_time_stamp.TXT"로 변경 하고 즉시 다운로드할 수 있습니다.

ftp -niv $url << FTP_COMMAND
        user $user $password
        cd $remotedir
        nmap N*.TXT N_`date "+%H%M%N"`.TXT
        mget N*
        bye
FTP_COMMAND

문제는 nmap이 mget에 전달된 모든 파일에 대해 동일한 %N 값을 유지하며 다운로드할 때마다 현재 나노초 값으로 변경되어야 한다는 것입니다.

250 CWD command successful.
local: N_1054232349627.TXT remote: NO2346662345257245624572457245724562411125555341346134771345123461146-44.TXT
227 Entering Passive Mode (xxxxxxxxxxxxxxx).
125 Data connection already open; Transfer starting.
226 Transfer complete.
2220 bytes received in 0,0995 secs (22 Kbytes/sec)
local: N_1054232349627.TXT remote: NO2346662345257245624572457245724562411125555341346134771345123461146-45.TXT
227 Entering Passive Mode (xxxxxxxxxxxxxx).
125 Data connection already open; Transfer starting.
226 Transfer complete.
2220 bytes received in 0,107 secs (20 Kbytes/sec)

다운로드할 때마다 업데이트하는 방법이 있나요 nmap?

답변1

그리고 zsh:

autoload zfinit
zfinit
zmodload zsh/datetime

files=N*.TXT
zfopen $host $user $passwd &&
  zfcd $remotedir &&
  zfrglob files &&
  for f ($files) {
    t=$EPOCHREALTIME
    strftime -s ts %H%M%S ${t%.*}
    ts=$ts.${t#*.}
    zfgcp -Gt $f N_$ts.TXT
  }
zfclose

답변2

ftp나는 이것이 이것을 수행하는 데 적합한 도구라고 생각하지 않습니다. 한번 시도해 보겠습니다 lftp. 당신이 쓴대로 :

    nmap N*.TXT N_`date "+%H%M%N"`.TXT

Get은 한 번 평가된 후 현재 날짜로 확장되며, 그 이후부터는 확장된 형식으로만 사용됩니다. 당신이 원하는 것은 원격 끝이 당신을 위해 이 확장을 수행하도록 하는 것인데, 나는 당신이 일반 FTP로는 그렇게 할 수 있다고 믿지 않습니다.

다음과 같은 것이 "작동할 수 있습니다" lftp.

$ lftp -u user,password IP <<EOF
!whoami
quit 0
EOF

현재 FTP 서버에 접근할 수 없어서 테스트할 수 없습니다. 작동하는 경우 명령 date이 원격 서버에서 실행되도록 수정할 수 있습니다.

인용하다

답변3

FTP로 복잡한 작업을 수행하는 쉬운 방법은 FTP를 다루지 않는 것입니다. FTP 리소스를 파일 시스템으로 마운트합니다.퓨즈오늘날에는 소프트웨어 구성이 제한된 서버에서도 널리 사용 가능합니다. 당신은 그것을 사용할 수 있습니다그래프FTP 디렉터리를 마운트합니다.

mkdir /net/someftp.example.com
curlftpfs -o user=bob someftp.example.com /net/someftp.example.com

FTP 비밀번호 저장~/.netrc.

그런 다음 일반 쉘 명령을 사용하여 원하는 이름으로 파일을 복사하십시오. 나는 이 마이크로초 날짜 구성표를 권장하지 않습니다. 왜냐하면 시계 업데이트가 매우 빠르게 이루어지기 때문입니다. 이는 특히 스크립트가 실행되는 동안 시계를 조정할 때 문제가 될 수 있습니다. 대신 카운터를 이용해주세요.

counter=10000
date=$(date +%Y%m%d-%H%M%S)
for x in /net/someftp.example.com/dir/N*.txt; do
  cp -p "$x" "N-$date-${counter#1}.TXT"
  counter=$((counter+1))
done

FTP 디렉터리 사용을 마친 후 fusermount -u /net/someftp.example.com.

답변4

글쎄, 나는 Stephane과 slm의 답변을 기반으로 일종의 하이브리드 구현을 만들었습니다. zsh는 프로덕션 서버이고 새 셸을 설치할 수 없기 때문에 zsh를 사용할 수 없으므로 이미 설치된 lftp를 사용했습니다.

설명하다: FTP 서버에 연결하고 첫 번째 here_docs( )에 FTPLISTGET파일( )을 나열합니다 nlist. 목록이 if [ $? -eq 0 ]성공적으로 다운로드되면( ) 연, 월, 일, 시, 분, 나노초 형식으로 파일 이름을 현재 날짜로 하나씩 바꿉니다. 일부 FTP는 매우 빠르므로 두 번째 FTP를 저장하면 파일을 덮어쓸 수 있습니다.

exec_ftp(){

# LIST
LIST_FTP=`lftp $protocol://$url << FTPLISTGET
        user $user $pass
        nlist
        bye
FTPLISTGET`

# Check if list is not empty, proceed...
if [ $? -eq 0 ]; then
        echo "$LIST_FTP" | while read file
        do
                DEST="N_$(date +%Y%m%d%H%M%N).TXT"
                lftp $protocol://$url <<-DOWNLOAD
                        user $user $pass
                        cd $remotedir
                        get $file -o /home/user/$DEST
                        rm $file
                        bye
                DOWNLOAD
        echo "Done in $(date +%d/%m/%Y-%T)" >> /var/log/transfer_ftp.log
        done

# If listing is not possible, 
else
        echo "FTP: $url user: $user - Cant reach host, or wrong credentials" >> /var/log/transfer_ftp_error.log
fi

}

편집 1: 백틱을 $(...)slm이 제안한 대로 변경하고 변수를 추가합니다 $protocol. 왜? lftp는 sftp와 ftps를 다운로드하고 자동화할 수 있기 때문에 이는 우리에게 좋습니다 :)

관련 정보