Команда grep работает в testdir, но не в "реальном" каталоге - PullRequest
3 голосов
/ 15 июля 2010

Я просто подумал, что нашел свое решение, потому что команда работает в моей тестовой директории.

grep -H -e 'author="[^"].*' *.xml | cut -d: -f1 | xargs -I '{}' mv {} mydir/.

Но с использованием команды в директории non-test команда не работала: Это сообщение об ошибке:

grep: unknown option -- O
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

Даже это не сработало:

$ grep -H author *.xml

или это:

$ grep -H 'author' *.xml

(то же сообщение об ошибке)

Я подозреваю, что это имеет какое-то отношение к именам файлов или количеству файлов.У меня почти 3000 файлов в не-тестовой директории и только 20 в моей тестовой директории.В обоих каталогах почти все имена файлов содержат пробелы и "-".

Дополнительная информация:

  • Я использую Cygwin.
  • Мне не разрешено изменять имена файлов

1 Ответ

1 голос
/ 15 июля 2010

Попробуйте (обновлено):

grep -HlZ 'author="[^"].*' -- *.xml | xargs -0 -I {} mv -- {} mydir/

ОБЪЯСНЕНИЕ (обновлено)

  • В вашем "реальном" каталоге у вас есть файл с именем, начинающимся с -O. Ваша оболочка расширяет список файлов *.xml, и grep принимает ваше - начальное имя файла в качестве опции (недопустимо). То же самое происходит с mv. Как объяснено в разделе Common options info coreutils, вы можете использовать -- для разделения списка параметров. То, что следует после --, считается операндом, а не опцией.

  • Используя опцию -l (в нижнем регистре L), grep выводит только имя файла соответствующих файлов, поэтому вам не нужно использовать cut.

  • Чтобы правильно обрабатывать каждое странное имя файла, вы должны использовать пару -Z в grep и -0 в xargs.

  • Не нужно использовать -e, потому что ваш паттерн не начинается с -.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...