첫째, 왜 이것을 시도해야 합니까? 날짜 "스탬핑"으로 파일을 단축하려면 일부 파일을 다운로드하고 이름을 바꿔야 하기 때문입니다. 원격 파일의 파일 이름은 매우 커서 변경할 수 없습니다(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를 다운로드하고 자동화할 수 있기 때문에 이는 우리에게 좋습니다 :)