linux - 为什么 'find' 命令失败没有错误?

标签 linux find

注意
似乎我忘记提到这只会在重新启动后发生。启动后,我是在启动后 5 分钟还是在启动后 3 天运行命令都没有关系。但曾经find运行,它总会找到它(即使在 5 分钟或 3 天后)。

我有一个运行 Linux 4.9.17-v7+ 的 Raspberry Pi 3。我不知道为什么会发生这种情况,但是每次我登录机器并尝试查找已知的 png 文件时,提示都会返回,好像没有结果一样。知道该文件存在后,我再次运行相同的命令(向上箭头键)并返回正确的结果。

如何使用 find 命令获得 2 个不同的结果(或不一致的结果)?可能有我遗漏的包裹吗?

文件存在的证明:

me@here:~ $ ls -la /opt/retropie/supplementary/splashscreen/retropie-default.png
-rw-r--r-- 1 root root 1168926 Mar 30 19:51 ls -la /opt/retropie/supplementary/splashscreen/retropie-default.png

但是当我运行 find 命令时,提示返回没有结果或错误:
me@here:~ $ sudo find / -name *default.png
me@here:~ $

如果我再次运行 find 命令,我会得到以下结果:
me@here:~ $ sudo find / -name *default.png
/opt/retropie/supplementary/splashscreen/retropie-default.png
me@here:~ $

我究竟做错了什么?我错过了一个包裹吗?程序是否已损坏?当我搜索某物但没有得到结果时,我如何知道它是否存在?请帮我!

更新 1:
评论请求。

使用 -name 运行命令引用的论点:
me@here:~ $ sudo find / -name '*default.png'
me@here:~ $ sudo find / -name '*default.png'
/opt/retropie/supplementary/splashscreen/retropie-default.png
me@here:~ $

更新 2:
将 SD 卡带到另一台计算机,安装并再次搜索 sudo find /mnt/flash -name '*default.png'产生了正确的结果。所以它必须是操作系统或可能是硬件问题。

更新 3:
我在树莓派 3 上加载了一个新的操作系统,然后把有问题的“sd 卡/操作系统”安装到树莓派 3 上。这是为了看看它是否可能是硬件错误。 sudo find /mnt/flash -name '*default.png'产生了正确的结果。所以它必须是操作系统。

本来我拿的是RetroPie v4.2,让它自动运行停止。拿了我的娱乐软件并编译了它。将其设置为在启动时与 lirc 一起运行。娱乐软件中的一个选项是运行 Emulationstation(您注释掉的命令以在启动时停止仿真软件的自动运行)。这一切都有效。所以我不知道什么会导致这个问题。

据我所知,文件所在的/opt 目录与其他目录没有区别。

更新 4:
好的,在搜索 '*default.png' 之前,我做了 sudo find / -name 'hostname'它返回了正确的结果。然后我跑了sudo find / -name '*default'它找到了。所以只有第一个 find命令可能会失败。随后的一切似乎都有效。

更新 5:
我能够找到另一个操作系统,其中第一个 find并不总是有效。我有另一个运行 Arch Linux 4.1.7-2-ARCH 的 Raspberry Pi 1 Model B。它不包含我一直在搜索的 png,但我还是搜索了它。
me@there:~ $ sudo find / -name '*default.png'
me@there:~ $ sudo find / -name '*default.png'
/usr/share/icons/Adwaita/256x256/status/avatar-default.png
/usr/share/icons/Adwaita/8x8/emblems/emblem-default.png
/usr/share/icons/Adwaita/16x16/emblems/emblem-default.png
/usr/share/icons/Adwaita/16x16/status/avatar-default.png
/usr/share/icons/Adwaita/22x22/emblems/emblem-default.png
/usr/share/icons/Adwaita/22x22/status/avatar-default.png
/usr/share/icons/Adwaita/32x32/emblems/emblem-default.png
/usr/share/icons/Adwaita/32x32/status/avatar-default.png
/usr/share/icons/Adwaita/48x48/emblems/emblem-default.png
/usr/share/icons/Adwaita/48x48/status/avatar-default.png
/usr/share/icons/Adwaita/24x24/emblems/emblem-default.png
/usr/share/icons/Adwaita/24x24/status/avatar-default.png
/usr/share/gtk-doc/html/gtk3/window-default.png
me@there:~ $ 

所以 2 个不同的操作系统和 2 个不同的树莓派有同样的问题。我已经在我的 Banana Pi 上测试过这个,结果第一次是正确的。

更新 6:
好的,更新一些评论。
是的,文件 retropie-default.png位于根目录中,并且系统上的任何地方都没有 autofs/unionfs。
sudo find /opt/retropie/supplementary/splashscreen/ -name '*default.png'行为方式不同,但确实产生了正确的结果。

运行 sudo date两次确实会产生正确的结果。

请阅读本文开头的注释,因为我忘记了一个重要的观点。

我将在今天晚些时候运行 strace。

更新 7:
列出 find 之前的目录命令仍然产生相同的结果。
me@here:~ $ ls /opt/retropie/supplementary/splashscreen/
LICENSE                             retropie-2015-carbon-video.mp4
README.md                           retropie-2015.png
retropie-2013.png                   retropie-default-16x10.png
retropie-2014.png                   retropie-default-4x3.png
retropie-2015-4x3.png               retropie-default.png
retropie-2015-carbon-video-4x3.mp4
me@here:~ $ sudo find / -name '*2013.png'
me@here:~ $ sudo find / -name '*2013.png'
/opt/retropie/supplementary/splashscreen/retropie-2013.png
me@here:~ $

更新 8:sudo strace -o log1 find / -name '*default.png' and then sudo strace -o log2 find / -name '*default.png'这些日志文件很大。我在里面寻找什么?执行 cat logn|grep 'x' 其中 x 是'警告、警告、警告、错误、错误、错误。我还应该检查什么?日志文件 log1 = 9.9M 和 log2 = 13 M 存在大小差异

我确实在两个日志文件的末尾注意到 log2 中有一个不同的命令。 munmap(0x76f31000, 4096)不在 log1 中。也许这就是失败的地方?

最佳答案

您可以查看“查找”联机帮助页以获取答案。如果要在命令中使用正则表达式,则必须引用正则表达式。
您的命令应该是 sudo find / -name \*default.pngsudo find / -name '*default.png'
手册页引用如下

无BUG

“路径必须在表达式之前”错误消息
$ find . -name *.c -print find: paths must precede expression Usage: find [-H] [-L] [-P] [-Olevel] [-D ... [path...] [expression]
这是因为 *.c已被 shell 扩展,导致 find 实际上收到这样的命令行(如果 frcode.c locate.c word_io.c 文件夹中有 . 文件):
find . -name frcode.c locate.c word_io.c -print
该命令当然不起作用。不要以这种方式做事,您应该将模式括在引号中或转义通配符:
$ find . -name '*.c' -print $ find . -name \*.c -print

关于linux - 为什么 'find' 命令失败没有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43127466/

相关文章:

linux - 如何使用egrep查找包含字符串的文件

javascript - 有没有办法在javascript中检测页面搜索中的查找

Bash 脚本 : Use of date in foldername for calculation (Delete folders older than X)

linux - 使用 Linux 获取包含特定文本的文件

linux - 大页面性能下降

php - 从 cakephp 运行 linux bash 命令

linux - 用于随机数生成的新建/dev 设备文件

linux - 监控 Web 托管服务器上的传入请求

linux - 创建共享库链接器 undefined reference

c - 在具有重复值的未排序数组中查找缺失的数字