现有文件对于某些应用程序来说是“不可见的”

现有文件对于某些应用程序来说是“不可见的”

我在访问运行 CENTOS 6.5 的 Linux 服务器上以 NFS 类型挂载的 ext4 文件系统上的文件时遇到问题。我知道这些文件存在于此文件系统上,因为当我明确调用它们时(例如使用lsawk或)我可以看到它们,但当从 或 等管道传输到另一个程序(如或 )时,某些程序(如或cat)看不到它们。rsynclsgrepawk

为了说明起见,举个例子,以下内容将返回空:

ls /mnt/seisvault2/data/sac/201402/20140203_220000_MAN/ | grep WCI\.BH1\.IU.10

虽然这表明该文件确实存在:

ls /mnt/seisvault2/data/sac/201402/20140203_220000_MAN/WCI.BH1.IU.10

在存在此问题的众多目录中,大多数文件均能正常出现,而不需要像示例中所示那样明确调用。

有人能帮助我理解这个问题吗?

举个例子来说明为什么这是一个问题,rsync -a 在第一次运行时复制了“丢失”的文件,但是对于每次后续运行,它都认为该文件不在目标目录中,因此再次复制它。

答案1

这个问题似乎可以通过文件共享/NFS 下的配置设置来解决。最初,我将操作模式配置为“用户模式”。但是,看起来应该是“内核模式”。

答案2

Grep 使用正则表达式,其中 '.' 恰好是一个特殊字符。为了演示,假设我创建一个空文件并执行以下操作:

[root@db test]# touch testfile{1,2,3,4,5}
[root@db test]# touch testfile{1,2,3,4,5}.other
[root@db test]# ls -lah
total 8.0K
drwxr-xr-x  2 root root 4.0K Jun 21 00:43 .
dr-xr-x---. 4 root root 4.0K Jun 21 00:41 ..
-rw-r--r--  1 root root    0 Jun 21 00:43 testfile1
-rw-r--r--  1 root root    0 Jun 21 00:43 testfile1.other
-rw-r--r--  1 root root    0 Jun 21 00:43 testfile2
-rw-r--r--  1 root root    0 Jun 21 00:43 testfile2.other
-rw-r--r--  1 root root    0 Jun 21 00:43 testfile3
-rw-r--r--  1 root root    0 Jun 21 00:43 testfile3.other
-rw-r--r--  1 root root    0 Jun 21 00:43 testfile4
-rw-r--r--  1 root root    0 Jun 21 00:43 testfile4.other
-rw-r--r--  1 root root    0 Jun 21 00:43 testfile5
-rw-r--r--  1 root root    0 Jun 21 00:43 testfile5.other

现在,让我们进行一些 grepping!正如预期的那样,ls | grep test返回目录中的所有文件:

[root@db test]# ls | grep test
testfile1
testfile1.other
testfile2
testfile2.other
testfile3
testfile3.other
testfile4
testfile4.other
testfile5
testfile5.other

但是假设我们只想要其中带有“.”的文件:

[root@db test]# ls | grep .
testfile1
testfile1.other
testfile2
testfile2.other
testfile3
testfile3.other
testfile4
testfile4.other
testfile5
testfile5.other

嗯,这很糟糕。如上所述,“。”在常用表达(即匹配 1 个字符)。如何解决这个问题?反斜杠可以解决这个问题...因为... ESCAPANATOR

[root@db test]# ls | grep '\.'
testfile1.other
testfile2.other
testfile3.other
testfile4.other
testfile5.other

请注意,我将其放在单引号中。在大多数情况下,这也适用于双引号(shell 扩展可能会在更复杂的正则表达式中让你感到困惑)。如果您需要在没有任何引号的情况下执行此操作,则必须转义两次(一次用于 bash,一次用于 grep)。它看起来像这样:

[root@db test]# ls | grep \\.
testfile1.other
testfile2.other
testfile3.other
testfile4.other
testfile5.other

相关内容