我有一个 sftp 服务器([电子邮件受保护])。我正在尝试连接到它并搜索包含以下内容的文件。TXT在 (/files/base/incomming) 路径中并获取包含 (.txt) 的每个文件中的行数。我试图使用以下命令来实现,但它被抛出为无效命令:
echo "wc -l *.txt*"|sftp -q [email protected]:/files/base/incomming
o/p
sftp>
invalid command
有什么办法可以解决这个问题吗?
答案1
sftp
不会分叉 shell,因此您无法在那里使用常用命令。假设您也可以通过ssh
您可以使用
ssh [email protected] 'ls /files/base/incomming/*.txt' | wc -l
或者
ssh [email protected] 'ls /files/base/incomming/*.txt | wc -l'
完成问题中描述的任务。
如果(无论出于何种原因)您想要使用,sftp
您需要使用其中可用的命令之一ftp
(并希望ftpd
另一侧知道如何处理通配符):
echo 'ls -l /files/base/incomming/*.txt' | sftp [email protected] | wc -l
答案2
如果文件数量不太大,您可以使用 globbing 将位置参数设置为每个匹配的文件名,然后回显计数:
count=$(ssh [email protected]
'set -- /files/base/incomming/*.txt; echo "$#"')
或者,如果文件数量是大(但小于uintmax_t
),并且你有 GNU find (对于-printf
扩展),那么你可以使用我从史蒂芬那里看到的一个把戏:
count=$(ssh [email protected]
'find /files/base/incomming -maxdepth 1 -type f -name '*.txt' -printf . | wc -c')
上面find
针对给定目录运行命令,将深度限制为该目录,并将匹配限制为纯文件 ( -type f
) 且名称以.txt
;结尾。对于每场比赛,都会打印一个句点,其总数wc -c
由命令替换到 的赋值中计算并返回count
。