Bash 如何跟踪除一个文件之外的所有文件

Bash 如何跟踪除一个文件之外的所有文件,bash,find,tail,Bash,Find,Tail,我有两个目录上的日志文件,为了简单起见,我将调用dir1和dir2 假设用户输入位于dir1中的file.log,我应该跟踪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

我有两个目录上的日志文件,为了简单起见,我将调用dir1和dir2

假设用户输入位于dir1中的file.log,我应该跟踪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                                               

正如您所看到的,所有文件都有尾随,即使我在参数
$1

中指定file-1.log为不尾随,类似这样的内容应该会:

find . -type f ! -name "*dir1/file.log" -exec tail {} \;
也就是说,使用
find-执行尾部{}\
添加额外条件,即文件不必命名为
file.log


更新
如果文件名是中的参数,如何使用find 命令行。例如查找-类型f-名称“$1”

比如说:

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


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

以下内容将
跟踪
dir1
dir2
中除
file.log
之外的所有文件:

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

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

这将查找所有不是名为“file.log”的文件的内容。(该!需要移动)因为我不知道用户想要删除的文件是什么,我不知道文件位于Yes@Williampersell中的哪个目录,这是OP想要的。@user2864207那么您可以只写
file.log
。如果文件名是命令行中的参数,我如何使用find。例如find-键入f-名称“$1”我有一个小问题。假设我的日志文件位于/path/to/a/log/file中,如果我写tail-f/path/to/a/log/file,它会跟踪这个目录中的所有文件吗?@user2864207是的,
tail-f/path/to/a/log/!(file.log)
将跟踪所述目录中除
file.log以外的所有文件
@user2864207为了提供多个目录,您可以说
tail-f{/path/to/a/log,/path/to/other/log}/!(file.log)
这将排除两个指定目录中的
file.log
!(“$3”)>/other/path/file 2>/dev/null&。“$3”是与文件对应的参数。这太棒了:)