如何尾除除一个文件外的所有文件

use*_*207 4 bash tail find

我在两个目录中都有日志文件,为简单起见,我将依次调用目录1和目录2。

假设用户输入了位于dir1中的file.log,我应该在-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                                                        
Run Code Online (Sandbox Code Playgroud)

节点只是存储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                                               
Run Code Online (Sandbox Code Playgroud)

如您所见,即使我将file-1.log指定为不带参数,也将所有文件都带尾$1

dev*_*ull 5

在将下面tail的所有文件dir1dir2除外file.log

shopt -s extglob
tail -f {dir1,dir2}/!(file.log)
Run Code Online (Sandbox Code Playgroud)

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


fed*_*qui 0

像这样的事情应该做到:

find . -type f ! -name "*dir1/file.log" -exec tail {} \;
Run Code Online (Sandbox Code Playgroud)

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


更新

如果文件名是命令行中的参数,我该如何使用 find 。例如 find 。!-类型 f -名称“$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\" ... "因为要“发送”变量,您需要双引号。