我想在/sys/class/tty/*
目录中搜索一个字符串。所以我尝试了:
# grep -rn path -e pattern
Run Code Online (Sandbox Code Playgroud)
但它什么都不返回。例子:
# cat /sys/class/tty/ttySTM0/iomem_base
0x40010000
# ls -l /sys/class/tty/ttySTM0/iomem_base
-r--r----- 1 root root 4096 Jan 17 10:37 /sys/class/tty/ttySTM0/iomem_base
# grep -rn /sys/class/tty/ -e 0x40010000
#
Run Code Online (Sandbox Code Playgroud)
如果我在另一个目录中使用相同的语法,它似乎可以工作:
# grep -rn /opt -e Could
# /opt/logs/joku1_log.txt:29:Could not read interface wlan0 flags: No such device
Run Code Online (Sandbox Code Playgroud)
这样的研究有什么注意事项吗?我的目标是找到哪个tty
具有特定iomem_base
地址。
请改用以下任一方法:
grep -rn /sys/class/tty/* -e 0x40010000 2> /dev/null
grep -Rn /sys/class/tty/ -e 0x40010000 2> /dev/null
Run Code Online (Sandbox Code Playgroud)
在第一个命令的水珠,需要以拥有它遵循未在命令行上指定的内容的符号链接/sys/class/tty
都是符号链接的内容/sys/devices/virtual/tty
和/sys/devices/platform/serial####/tty
。
在-R
与正被不需要水珠在第二命令遵循缺省符号链接。
我添加2> /dev/null
了发送Input/output error
和Permission denied
消息,/dev/null
因为当所有这些都没有返回时,输出更容易阅读。
中的条目/sys/class/tty
是目录的符号链接,/sys
根据设备内部连接的方式组织不同部分的目录。grep -r
不遵循指向目录的符号链接。
grep -R
遵循符号链接,但在/sys
递归遍历时遵循目录是一个坏主意,因为存在无限循环(/sys/foo/bar
是指向 的/sys/corge/wibble
链接/sys/foo
)。
所以更精确地指定路径。这足以在所有 tty 设备的所有文件中搜索:
grep -l -r -x 0x40010000 /sys/class/tty/*/
Run Code Online (Sandbox Code Playgroud)
顺便说一句,由于您已经知道文件的全部内容并想要文件名,-n
因此没有用并且-l
为您提供整洁的输出。-x
有助于避免误报(但这里没有必要,因为内容iomem_base
具有固定长度)。
但既然您知道文件的基本名称,只需搜索该名称即可。
grep -l -x 0x40010000 /sys/class/tty/*/iomem_base
Run Code Online (Sandbox Code Playgroud)