运行 使用 xargs 的远程服务器上的 basename 没有产生预期的结果

Running basename on remote server with xargs does not produce expected results

假设我在名为 ~/local/directory 的本地目录中有一个文件 myFile.txt,那么以下命令会产生预期的结果(完整的文件路径后跟仅文件名):

find ~/local/directory -type f -iname '*myFile*' | xargs -I{} sh -c '{ echo {}; echo $(basename {}); }'

但是,现在假设我在名为 remote-host 的远程系统上的目录 ~/test/directory 中有一个文件 myFile2.txt。尝试 运行 上面的相同命令远程打印出完整的文件路径两次,就好像 basename 不起作用一样。我做错了什么?

ssh -q remote-host "find ~/test/directory -type f -iname '*myFile*' | xargs -I{} sh -c '{ echo {}; echo $(basename {}); }'"

(我的最终目标是 运行 在远程环境中对 find 返回的文件进行 rsync,并将它们保存回本地到特定目录,但在文件名中添加前缀,因此需要对于 basename。使用 xargs 而不是 rsync 的 -exec 选项似乎更可行。)

您需要对 $ 进行转义,以便将其按字面意思发送到远程机器。否则,$(basename {}) 在本地执行,输出 {} 代入 ssh 参数。

ssh -q remote-host "find ~/test/directory -type f -iname '*myFile*' | xargs -I{} sh -c '{ echo {}; echo $(basename {}); }'"