使用xargs参数两次

10 浏览
0 Comments

使用xargs参数两次

我需要检查本地文件是否与远程主机文件相同。\n文件位置如下:\n本地机器上的File1\n./remotehostname/home/a/b/scripts/xyz.cpp\n远程机器上的File2\nremotehostname:/home/a/b/scripts/xyz.cpp\n我打算使用以下命令比较这两个文件:\n

diff  ./remotehostname/home/a/b/scripts/xyz.cpp remotehostname:/home/a/b/scripts/xyz.cpp
 find . -type f | grep -v .svn |xargs -I % diff % 

\n我需要将%更改为remotehost并比较文件。\n不确定如何在%上应用sed。或者是否有更好的比较这类文件的方法。\n一种方法是保存文件列表,然后在该文件上应用sed,但我认为应该有一种更好的方法。而且diff在远程主机上不起作用,也许我需要使用干燥rsync的输出?

0
0 Comments

使用xargs参数两次的问题的原因是需要将文件的本地路径和远程服务器的路径进行比较,但是在命令中没有直接提取出远程服务器的名称。解决方法是使用GNU Parallel工具来实现并行化运行任务,并且可以方便地提取出远程服务器的名称。

首先,我们可以使用以下命令来安装GNU Parallel:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

接下来,可以使用以下命令来使用GNU Parallel并行运行任务:

find . -type f | grep -v .svn |
  parallel diff {} '<(ssh {= s:./::;s:/.*:: =} cat {= s:([^/]+/){2,2}::;$_=::shell_quote_scalar($_) =})'

这个命令会找到当前目录下的所有文件,然后排除掉包含`.svn`的文件。接着,使用GNU Parallel工具并行地运行`diff`命令来比较本地文件和远程服务器上的文件。

在命令中,使用了两次`xargs`参数来实现提取出远程服务器的名称和路径。首先,使用`{= s:./::;s:/.*:: =}`来提取出远程服务器的名称,然后使用`{= s:([^/]+/){2,2}::;$_=::shell_quote_scalar($_) =}`来提取出远程服务器的路径。

通过使用GNU Parallel工具,可以实现并行化运行任务,并且可以提取出远程服务器的名称和路径,解决了使用xargs参数两次的问题。

0
0 Comments

问题:使用xargs参数两次的原因是什么?如何解决?

在上述内容中,问题是使用xargs参数两次的方法。原因是xargs命令在处理包含空格的文件名时会出错。为了解决这个问题,可以使用bash的while read方法来替代xargs方法。

xargs方法:

该方法首先使用find命令查找当前目录下的所有文件,然后使用grep命令排除所有包含.svn的文件。接下来,使用sed命令复制并修改输入,添加"remotehostname:"前缀。最后,使用xargs命令每次传递两个输入到diff命令进行比较。然而,如果文件名中包含空格,则该方法将无法正常工作。

bash方法:

为了解决xargs方法中的问题,可以使用bash的while read命令来替代。该方法首先使用find命令查找当前目录下的所有文件,然后使用grep命令排除所有包含.svn的文件。然后,使用while read命令逐行读取输入,并将每行赋值给变量$line。然后,在循环中可以根据需要对文件名进行任何修改,并使用diff命令进行比较。当输入结束时,read命令返回false,循环退出。

需要注意的是,将内容传递给循环时可能会产生一些有趣的副作用,这在这个问题中并不相关,但可能会在其他情况下导致问题。

为了解决使用xargs参数两次的问题,可以使用bash的while read方法来替代xargs方法。

0