質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

Q&A

解決済

1回答

237閲覧

FTPでフォルダ内の指定条件のファイルのみをダウンロードしたい

assemble

総合スコア6

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

0グッド

1クリップ

投稿2024/11/04 08:33

実現したいこと

FTP(Windows)によりアクセスしたフォルダ内にあるファイルを、下記のような2つの条件を指定して取得したいです。(条件ごとに取得したいため、1 AND 2 ではありません。独立です。)
1.フォルダ内で最新のファイルだけダウンロード
2.フォルダ内のデータで指定した保存日時にあてはまるもの

FTPとテキストファイルのみで実現したいと考えています。
不可能であれば可能な方法を教えていただきたいです。

後述していますがFTP初心者であるため、方法だけでなくサンプルコードも記載していただけると非常に助かります。

有識者の方々のお力を貸していただきたいです、よろしくお願いいたします。

発生している問題・分からないこと

getによる名称指定はフォルダ内のデータが更新され続けるため、mgetはデータ数が大きすぎるため使用できません。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

getによるファイル名指定や、mgetによる一括ダウンロードしかサンプルコードを発見できませんでした。
FTP初心者であるため、上手に検索できていないのかもしれません。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

案1:何ら中のプログラミング言語のftpライブラリを使って、ファイルのタイムスタンプを取得して、処理する。
やり方は、言語やライブラリ依存。
ただ、質問の書きぶりからして、こういう方面の解決を望んではいらっしゃらない気がします。

案2: ftpコマンドを実行して、ファイルの一覧を取得して、ftpコマンドのテキストファイルを作成して再度ftpコマンドを実行して取得する。
という方向で簡単に説明します。特に記述が無いので、「Windows標準のftpコマンド」前提で書きます。他のftpコマンドでも書式が異なるだけで同様のことは出来ます。また、サーバーはUnix/Linux系と想定します。これもWindowsであったらそれに合わせてコマンドを変えればいいだけです。

text

1open ftp.example.jp 2ユーザ名 3パスワード 4cd 目的ディレクトリ 5ls -ltr XXXXX.list 6quit

のようなファイルを作って、ftp -s:そのファイル名で実行するとカレントディレクトリーにXXXXX.listというファイルが出来て、目的ディレクトリの中のファイル一覧が、

text

1-rw-r--r-- 1 ftp ftp 41296198 Sep 29 08:41 gdb-15.2.tar.gz 2-rw-r--r-- 1 ftp ftp 95 Sep 29 08:41 gdb-15.2.tar.gz.sig 3-rw-r--r-- 1 ftp ftp 24332820 Sep 29 08:41 gdb-15.2.tar.xz 4-rw-r--r-- 1 ftp ftp 95 Sep 29 08:41 gdb-15.2.tar.xz.sig

のように入ります。
ls -ltr XXXXX.listというFTPコマンドは、Linuxのシェルのコマンドラインで、ls -ltr > XXXXX.listと実行するのと同じような意味です。引数の2番目は出力先のローカルファイル名なので、シェルコマンドラインのls -ltr *.tar > XXXXX.listに相当するFTPコマンドはls "-ltr *.tar" XXX.listのように引用符で囲みます。

lsdirの出力書式はFTPサーバーのOSやFTPサーバーソフト依存ですので、実際の環境を見てそれを解析するプログラムを書きます。

1.フォルダ内で最新のファイルだけダウンロード

であれば、上記の前提だとバッチで書くとこんな感じですね。
少なくともUnix/Linuxであれば、ls -trでファイル名だけ古い順に並ぶので、ファイルに書かれた最後の行が目的ファイル名です。

CMD

1@echo off 2REM ftpコマンドファイルを作る 3(echo open ftp.example.jp 4echo ユーザ名 5echo パスワード 6echo cd 目的ディレクトリ 7echo ls -tr TMP2 8echo quit) > TMP1 9 10REM それを実行する 11ftp -s:TMP1 12 13REM 取得した一覧の最後の行を得る 14for /f "delims=" %%A in (TMP2) do set LASTFILE="%%A" 15 16REM ftpコマンドファイルを作る 17(echo open ftp.example.jp 18echo ユーザ名 19echo パスワード 20echo cd 目的ディレクトリ 21echo bin 22echo get %LASTFILE% 23echo quit) > TMP3 24 25REM それを実行する 26ftp -s:TMP3 27 28REM 一時ファイルを削除したければ削除する 29del TMP1 TMP2 TMP3

最新のタイムスタンプを持つ物がファイルじゃなくてディレクトリーだったりすると駄目なので、
そういう可能性がある場合は、リスト取得の際にecho ls "-tr *.txt" TMP2のように拡張子を付けたワイルドカードにすると良いかと思います。前述のように引用符必須。

2.フォルダ内のデータで指定した保存日時にあてはまるもの

は、細かい要件が不明なのでサンプルコードは書きませんが、
上記のls -trls -ltrにしてタイムスタンプ付きで出力して、そこからタイムスタンプを手がかりにfindstrコマンド等で目的ファイル名を取り出して、以下同様でしょうか。ちょっとバッチでは慣れてないと大変かも知れないので、PowerShellとかVBScriptで書くのを考えても良いかと思います。
Unix/Linuxのls -lの日時表示は半年くらい以前と以降で書式が変わるので注意です。

投稿2024/11/04 13:26

編集2024/11/08 14:10
otn

総合スコア85778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

assemble

2024/11/06 00:37

回答ありがとうございます! つたない文章からもとめていることを的確に把握してくださっており大変助かります。 参考に解決を目指してみます!
assemble

2024/11/08 05:45

参考に問題を解決することができました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問