Bash

xargs 命令在本地電腦上執行,但在遠端主機上執行時導致“無效命令”錯誤

  • March 1, 2020

我在本地電腦上執行此命令以刪除文本文件中包含的文件列表。

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

為什麼這不起作用?

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而不被它處理。)

如果您真的想使用類似的工具,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.

引用自:https://unix.stackexchange.com/questions/570334