我正在使用伯恩外壳:#!/bin/sh
我正在编写一个脚本,该脚本查找与特定模式匹配的文件,并在执行命令时将每个输出复制到新目录。
myscript.sh
#!/bin/sh
ssh user@hostname find /path/to/find/file* -mtime 10 | while read -r LINE
do
scp -r user@hostname:$LINE /path/to/destination/
done
这是我的初始脚本,用于查找具有相同文件名模式的文件,但还有一些其他文件不具有相同的文件名模式。所以我决定使用 grep 并通过管道来查找,但它不再读取,ssh
而是在当前目录中查找显然不存在的文件。
这是一个例子:
ssh user@hostname find /path/to/find/* -mtime 10 | xargs zgrep -il 'pattern_to_find' | while read -r LINE
do
scp -r user@hostname:$LINE /path/to/destination/
done
看到我想使用这个命令find /path/to/find/* -mtime 10 | xargs zgrep -il 'pattern_to_find'
,但是当我将它与使用一段时间后|
它就不再工作了。
答案1
请勿find
与xargs
管道一起使用。如果这样做,请尝试使用 withfind -print0
和xargs -0
to 使用空字符而不是新行作为文件名分隔符。
从man find
:
-打印0
真的;在标准输出上打印完整的文件名,后跟一个空字符(而不是 -print 使用的换行符)。这允许处理查找输出的程序正确解释包含换行符或其他类型空格的文件名。该选项对应于 xargs 的 -0 选项。
所以,你的命令将是:
ssh user@hostname find /path/to/find/ -type f -mtime 10 -print0 | xargs -0 zgrep -il 'pattern_to_find'
但这-print0
不是 POSIX(如果我没记错的话)。因此,只有一种方法,请阅读下文。
或者使用命令选项而不使用管道-exec
的最佳方法:find
xargs
ssh user@hostname find /path/to/find/ -type f -mtime 10 -exec grep -il 'set' {} + ;
答案2
ssh -n user@hostname 'find /root/git/ -mtime 10 | while read -r LINE ; do echo $LINE; done'
-n选项来自man ssh
:
-n从 /dev/null 重定向标准输入(实际上,防止从标准输入读取)。当 ssh 在后台运行时必须使用此选项。 # ... # ssh 程序将被置于后台。 (如果 ssh 需要询问密码或密码短语,则此方法不起作用;另请参阅 -f 选项。)
编辑
好的,然后从 find 文件名应该回显(作为字符串)到 xargs 以作为参数传递给 grep/zgrep,检查一下(不需要 -print0):
ssh user@hostname find /path/to/find/* -mtime 10 | xargs echo | zgrep -i 'pattern_to_find' | while read -r LINE do scp -r user@hostname:$LINE /path/to/destination/ done