4

我在两个目录上有日志文件,为了简单起见,我将调用 dir 1 和 dir 2。

假设用户输入位于 dir1 中的 file.log,我应该 tail -f 从 dir1 和 dir2 中除 file.log 之外的所有文件。有人可以帮我解决这个问题吗?

ssh host 'find /path/to/a/log -maxdepth 1 -type f -name "file*" -name "*.log" ! -name "$1" -print0 -exec tail {} \;' > /home/pl-${node}.log

ssh host 'find /path/to/a/log -maxdepth 1 -type f -name "file*" -name "*.out" ! -name "$1" -print0 -exec tail {} \;' > /home/pl-${node}.out                                                        

node 只是一个存储 1 和 2 的变量。当我输入 ./test file-1.log 时,输出为:

pl-1.log
Oct 21 09:15 pl-1.out
Oct 21 09:15 pl-2.log
Oct 21 09:15 pl-2.out                                               

如您所见,所有文件都被拖尾,即使我在参数中指定 file-1.log 不被拖尾$1

4

2 回答 2

6

以下将来自和除了tail所有文件:dir1dir2file.log

shopt -s extglob
tail -f {dir1,dir2}/!(file.log)

手册提供了有关extglob(启用扩展模式匹配)的更多信息。

于 2013-10-17T14:36:48.147 回答
0

像这样的东西应该使它:

find . -type f ! -name "*dir1/file.log" -exec tail {} \;

也就是说,使用find ... -exec tail {} \;添加文件不必命名为的额外条件file.log


更新

如果文件名是命令行中的参数,我如何使用 find 。例如 find 。!-type f -name "$1"

像这样,例如:

ssh 主机 "find /path/to/a/log -maxdepth 1 -type f -name 'file*.log' !-name \"$1\" -print0 -exec tail {} \;" > /home/pl-${node}.out

请注意,我使用find ".... -name \"$1\" ... "的是因为要“发送”变量,您需要双引号。

于 2013-10-17T14:33:06.703 回答