使用 bash 脚本批量重命名 FTP 服务器上的文件
Posted
技术标签:
【中文标题】使用 bash 脚本批量重命名 FTP 服务器上的文件【英文标题】:Batch rename files on FTP server using bash script 【发布时间】:2014-11-01 01:34:00 【问题描述】:我编写了一个简短的 bash 脚本来将文件上传到 FTP 服务器。我必须使用 FTP……我无法控制远程服务器。上传位按预期工作,所以现在我想集成一些代码来重命名(移动)“Live”目录中的现有文件,然后再将新文件上传到它。 rename 命令不允许使用通配符或任何批处理,所以从我读过的内容来看,我需要循环它。
这是脚本。
#!/bin/bash
cd $UPLOADS
echo "open $SERVER
user $NAME $PASSWORD
binary
cd Live
ls > /tmp/$DIRLIST" > /tmp/ftp.$$
awk -F" " 'NR>2 print $9 ' /tmp/$DIRLIST > /tmp/$MOD
cat /tmp/$MOD | while read tif
do
echo "rename $tif ../Done/$tif" >> /tmp/ftp.$$
done
echo "mput *.tif
quit" >> /tmp/ftp.$$
ftp -pin < /tmp/ftp.$$
rm /tmp/ftp.$$
我正在登录,将 ls 的结果发送到一个临时文件,它给了我以下信息:
drwxrwxrwx 1 user group 0 Sep 7 08:27 .
drwxrwxrwx 1 user group 0 Sep 7 08:27 ..
-rw-rw-rw- 1 user group 6506940 Sep 7 11:07 FILENAME1.tif
-rw-rw-rw- 1 user group 6506940 Sep 6 10:21 FILENAME2.tif
然后运行 awk,它给了我这个:
FILENAME1.tif
FILENAME2.tif
我现在得到它的方式的问题是我正在构建 FTP 命令并最后运行它们,所以 awk 首先运行。只是没有文件可以运行 awk,因为 ls 还没有写入 temp ($DIRLIST) 文件。
我可以让整个过程在一个脚本中运行吗?如果可以,如何?我可以运行两个脚本,但不想这样做。
更新
以下工作完美,但需要登录,退出,然后重新登录:
#!/bin/bash
# log in once to write current list of files to /tmp/$DIRLIST
ftp -pin $SERVER <<END_SCRIPT
user $NAME $PASSWORD
cd Live
ls > /tmp/$DIRLIST
quit
END_SCRIPT
# skip first two lines(. and ..) get a clean list of files
awk -F" " 'NR>2 print $9 ' /tmp/$DIRLIST > /tmp/$MOD
# log back in rename existing files and upload new files
cd $UPLOADS
echo "open $SERVER
user $NAME $PASSWORD
binary
cd Live" > /tmp/ftp.$$
cat /tmp/$MOD | while read tif
do
echo "rename $tif ../Done/$tif" >> /tmp/ftp.$$
done
echo "mput *.tif
quit" >> /tmp/ftp.$$
ftp -pin < /tmp/ftp.$$
#cleanup
rm /tmp/ftp.$$
rm /tmp/$DIRLIST
rm /tmp/$MOD
【问题讨论】:
“以下工作完美,但需要登录,退出,然后重新登录”这是一个问题吗?如果有,为什么? 这不是一个真正的问题,只是看起来像一个黑客。想知道是否有更清洁的方法。 令我惊讶的是,1985 年用于访问超过 9.6Kbit/sec 线路的远程文件的协议会产生骇人听闻的解决方案。如果您要使用 Linux Userland Filesystem 之类的东西挂载远程站点,那么您不需要两次通过,因为您将拥有文件系统语义(根据谁在乎多少 ftp 交换来实现)。 为什么不将 echo "mput" 行移到 awk 语句之前,因为它会先执行,然后才能处理文件。此外,如果您连接到 *nix 框,重命名命令可以使用 perl 正则表达式进行批量重命名。 【参考方案1】:这就是我的意思,将 mput 放在 awk 上方,以便在连接文件时在重命名命中之前就在那里
#!/bin/bash
# log in once to write current list of files to /tmp/$DIRLIST
ftp -pin $SERVER <<END_SCRIPT
user $NAME $PASSWORD
cd Live
ls > /tmp/$DIRLIST
quit
END_SCRIPT
# skip first two lines(. and ..) get a clean list of files
awk -F" " 'NR>2 print $9 ' /tmp/$DIRLIST > /tmp/$MOD
# log back in rename existing files and upload new files
cd $UPLOADS
echo "open $SERVER
user $NAME $PASSWORD
binary
cd Live" > /tmp/ftp.$$
echo "mput *.tif
quit" >> /tmp/ftp.$$
cat /tmp/$MOD | while read tif
do
echo "rename $tif ../Done/$tif" >> /tmp/ftp.$$
done
ftp -pin < /tmp/ftp.$$
#cleanup
rm /tmp/ftp.$$
rm /tmp/$DIRLIST
rm /tmp/$MOD
【讨论】:
以上是关于使用 bash 脚本批量重命名 FTP 服务器上的文件的主要内容,如果未能解决你的问题,请参考以下文章