如何使用SFTP的ls命令列出指定文件夹下的所有子目录
问题根因
你当前遇到的单目录无返回问题,是ls命令的默认行为导致的:当ls的参数只有1个目录时,会默认输出该目录下的内容,而非目录本身的路径;当参数为多个目录时,会先打印每个目录的路径再输出内部内容,所以多目录场景下你可以正常拿到结果。
另外你当前用双引号包裹sftp执行的命令,会导致本地shell提前解析通配符*,如果本地存在和远程同名的路径,还会出现匹配结果异常的问题。
解决方案
方案1(推荐,命令更简洁)
给ls加上-d参数,强制输出目录本身而非内部内容,同时改用单引号包裹命令避免本地通配符解析:
echo 'ls -1d /path/to/folder/*/' | sftp -i /path/to/key user@host | grep -v 'sftp>'
如果要过滤掉异常报错行,只保留有效路径,可以再加一层匹配:
echo 'ls -1d /path/to/folder/*/' | sftp -i /path/to/key user@host | grep -v 'sftp>' | grep '^/'
方案2(兼容性更好,适配不支持ls -d参数的sftp服务端)
先进入目标目录,通过ls -l的输出筛选目录类型的行,再拼接出完整目录路径:
echo 'cd /path/to/folder ls -l' | sftp -i /path/to/key user@host | awk '/^d/ {print "/path/to/folder/"$9"/"}'
内容的提问来源于stack exchange,提问作者user16740005
相关产品推荐
相关产品推荐

