FTP一括ダウンロードと名前変更

FTP一括ダウンロードと名前変更

まず、なぜこれを試すべきですか?日付「スタンピング」でファイルを短縮するには、一部のファイルをダウンロードして名前を変更する必要があるためです。リモートファイルのファイル名は非常に大きく、変更できません(ftpではありません)。

ダウンロードする必要があるファイルごとに1つの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は一度評価され、現在の日付に展開され、それ以降は拡張形式でのみ使用されます。あなたが望むのは、リモートエンドにあなたのためにこの拡張を実行させることです。

次のようなものが「動作できます」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 ]正常にダウンロードされると()、年、月、日、時、分、ナノ秒の形式でファイル名を現在の日付に1つずつ変更します。一部のFTPは非常に高速なので、2番目の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をダウンロードして自動化できるので、これは私たちにとって良いです:)

関連情報