【问题标题】:ftp list file name via bashftp 通过 bash 列出文件名
【发布时间】:2017-12-15 10:27:12
【问题描述】:

我需要提取一个 ftp 服务器的文件列表(只是文件名)

我将所有命令放在一个txt文件中,并用

ftp -ivn < ftp.command > ls.txt

(ftp.command 的内容)

open 192.168.43.12
user user1 pasw1
ls

所以,ls.txt 包含

drwxr-xr-x    4 1000     100          4096 Dec 05 05:09 FILE1
drwxrwxrwx    2 1000     100          4096 Dec 11 09:38 FILE3
drwxrwxrwx    2 1000     100          4096 Dec 05 09:11 FILE2

我需要解压

FILE1
FILE2
FILE3

如何解析 ls 的输出?

谢谢

【问题讨论】:

    标签: bash ftp


    【解决方案1】:

    要仅检索文件名列表,请使用 nlist 而不是 ls

    在 FTP 协议层,命令是NLST

    可能仍然有您不想存储的输出(在我的简单ftp 客户端中,包含状态消息)。

    FTP 客户端和服务器在实现细节上有很大的不同,但协议正好提供了这种功能,因此您不必对收到的文件名列表进行任何额外的解析。

    【讨论】:

    • ls -1 是仅列出文件名的好方法,如果 FTP 服务器支持的话。
    • 这很愚蠢。使用专用的 FTP 命令代替依赖于服务器本地操作系统的命令。还有using ls in scripts is discouraged on Unix-like systems
    • 这取决于你的观点。 IMO,您的回答很愚蠢。 nlist 本身不是“专用 FTP 命令”,而是操作系统的抽象,并不总是可用。我只是在一台服务器上尝试了它,并得到了Invalid command. 我支持我的评论 - 它可能对某些用户来说很方便,具体取决于他们的具体用例。
    • 您的ftp 客户端可能会调用其他命令。看看您是否可以发送裸 FTP 协议级别的命令(也许可以尝试quote)和/或查阅您的 FTP 客户端的文档或在线帮助。有时它们非常“用户友好”,以至于您无法分辨命令的实际作用。
    【解决方案2】:

    找到解决办法

    grep -oE '[^ ]+$' ls.txt
    

    【讨论】:

    • 如果文件名包含空格,这显然会失败。如果文件名包含控制字符并且ftp 服务器将其显示为? 或其他任何内容,它也可能会失败。
    【解决方案3】:

    其实有很多方法可以做到,这里只介绍几种:

    1. ls whateveryouwant | xargs -n 1 basename代替ls

    2. 如果你知道路径,那么ls /path/*.txt | sed -r 's/^.+\///'

    3. ls -1 *.txt

    【讨论】:

    • 然后,在文件本身中,将 ls 替换为 ls -1 *.txt
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多