xargs 命令在本地计算机上运行,​​但在远程主机上运行时导致“无效命令”错误

xargs 命令在本地计算机上运行,​​但在远程主机上运行时导致“无效命令”错误

我在本地计算机上运行此命令来删除文本文件中包含的文件列表。

xargs rm -r < deletion_list.txt

它按预期工作并删除当前工作目录中列出的所有文件deletion_list.txt

然后,我使用sftp它连接到远程主机并在本地计算机上创建要从远程主机删除的文件列表。

连接到远程主机时,我一一输入这些命令:

更改本地工作目录:

lcd /home/user/files_to_delete

在与指定模式匹配的同一目录中的文件的本地工作目录中创建一个文本文件:

!ls *.txt > deletion_list.txt

这应该根据deletion_list.txt本地工作目录中的文件名删除远程主机上的文件,但会导致“无效命令”错误:

xargs rm -r < /home/user/files_to_delete/deletion_list.txt

为什么这不起作用?

答案1

sftp(参见)的文档man sftp开始

描述sftp 是一个文件传输程序,类似于ftp(1),它通过加密的ssh(1) 传输执行所有操作。

过了一会儿,它写道,

交互式命令进入交互模式后,sftp理解一组类似于ftp(1) 的命令。

并继续执行有效命令集 ( bye cd chgrp chmod chown df exit get help lcd lls lmkdir ln lpwd ls lumask mkdir progres put pwd quit reget reput rename rm rmdir symlink version ! ?)。该xargs命令不在该组中,因此您无法在sftp应用程序内使用它。 (请注意,这!是本地 shell 转义,它将行的其余部分传递到本地 shell。此类命令将被转义,sftp并且不会被本地 shell 处理。)

如果您确实想使用类似的工具,xargs则应该考虑使用它ssh来向远程主机提供基于 shell 的会话。而不是sftp user@remotehost您会使用ssh user@remotehost(假设您的系统管理员允许交互式会话)。确认此操作有效后,您可以跨主机将命令串在一起:

# On the local host
xargs rm -r < deletion_list.txt

# Also on the local host connnecting to the remote
ssh user@remotehost xargs rm -r < delete_list.txt

第二个命令的作用是连接到远程系统并xargs rm -r在其上运行,为其提供数据标准输入来自名为 的本地文件delete_list.txt

相关内容