まず、なぜこれを試すべきですか?日付「スタンピング」でファイルを短縮するには、一部のファイルをダウンロードして名前を変更する必要があるためです。リモートファイルのファイル名は非常に大きく、変更できません(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をダウンロードして自動化できるので、これは私たちにとって良いです:)