У меня проблема с доступом к файлам в файловой системе ext4, смонтированной как тип NFS на сервере Linux с CENTOS 6.5. Я знаю, что файлы существуют в этой файловой системе, потому что я могу видеть их, когда я их явно вызываю (например, с помощью ls
, awk
, или cat
), но не видны некоторым программам, например rsync
или когда по трубопроводу от ls
в другую программу, например grep
или awk
.
В качестве поясняющего примера следующее будет возвращено пустым:
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 копирует «отсутствующие» файлы при первом запуске, но при каждом последующем запуске не думает, что файл находится в целевом каталоге, и поэтому копирует его снова.
Эта проблема, похоже, решается настройкой конфигурации в разделе «Общий доступ к файлам / NFS». Первоначально у меня был режим работы, настроенный как «Пользовательский режим». Однако, похоже, это должен быть «режим ядра».
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
А теперь займемся греппингом! Как и ожидалось, 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
Обратите внимание, что я заключил его в одинарные кавычки. Это также будет работать с двойными кавычками - в большинстве ситуаций (расширение оболочки может сжечь вас на более сложных регулярных выражениях). Если вам нужно сделать это без кавычек, вам нужно дважды экранировать (один раз для bash, один раз для grep). Выглядит это так:
[root@db test]# ls | grep \\.
testfile1.other
testfile2.other
testfile3.other
testfile4.other
testfile5.other