使用 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 服务器上的文件的主要内容,如果未能解决你的问题,请参考以下文章

for in循环语句批量重命名的问题;bash

从文件名中批量删除“@2x”的 Bash 脚本/命令(视网膜图像 -> 正常)

2.13 批量重命名和移动

用shell命令对文件重命名

使用 PowerShell 重命名 FTP 上的文件

4Ubuntu装机之后浏览器 画图 文本 批量重命名 ssh 远程桌面 FTP 虚拟化