2014-10-02 5 views
0

, когда я использую это, чтобы посмотреть, чтобы увидеть, если есть конкретный файл в каталоге, ls конвейера к grep не работаетLs конвейеру Grep против LS файла Glob

[email protected]:/home/log$ ls -ltr | grep *FOO-VOL2* 

Но когда я использую ls с file globbing Я получаю результаты:

[email protected]:/home/log$ ls -ltr *FOO-VOL2* 
-rw-rw-rw- 1 casper casper 11489 Sep 24 18:00 FOO-VOL2.20140924.log.gz 
-rw-rw-rw- 1 casper casper 11885 Sep 25 18:00 FOO-VOL2.20140925.log.gz 
-rw-rw-rw- 1 casper casper  0 Sep 26 08:00 FOO-VOL2.sessiondump.log 
-rw-rw-rw- 1 casper casper 60906 Sep 26 18:00 FOO-VOL2.20140926.log 
-rw-rw-rw- 1 casper casper 58503 Sep 29 09:00 FOO-VOL2.20140929.log 
-rw-rw-rw- 1 casper casper 8259128 Sep 29 09:00 FOO-VOL2.sys.log 

В чем разница - должен работать grep to pipe.

+0

The * very * different in the corner case, где имя файла, соответствующее '* FOO-VOL2 *', содержит новую строку; вывод 'ls' будет охватывать несколько строк, а' grep' (при правильном регулярном выражении) отобразит только строку, содержащую 'FOO-VOL2'. – chepner

ответ

4

Оболочка расширяет *FOO-VOL2* Glob перед выполнением ничего, так что фактическая команда, которую вы бежите это:

ls -ltr | 
    grep FOO-VOL2.20140924.log.gz FOO-VOL2.20140925.log.gz FOO-VOL2.sessiondump.log \ 
     FOO-VOL2.20140926.log FOO-VOL2.20140929.log FOO-VOL2.sys.log 

При запуске с этими аргументами, grep игнорирует стандартный ввод приходя к нему от ls и поисков в файлах FOO-VOL2.20140925.log.gz, FOO-VOL2.sessiondump.log, FOO-VOL2.20140926.log, FOO-VOL2.20140929.log и FOO-VOL2.sys.log для строки "FOO-VOL2.20140924.log.gz". И не находит его, что, вероятно, не является неожиданностью.

Также, grep регулярные выражения и шаблоны оболочки оболочки различны. Образцы, которые вы передаете grep, не привязаны, поэтому вам не нужен эквивалент * по обе стороны строки, которую вы ищете. Но если вы это сделали, * не означает «любой символ»; это означает «0 или более предыдущего символа». Так как выражение grep, *FOO-VOL2* недействительно. Вы хотите только FOO-VOL2 или, как буквальный перевод с глобуса, хотя он включает в себя части, которые здесь не нужны, '.*FOO-VOL2.*'.

Смежные вопросы