Команда grep работает в testdir, но не в реальном каталоге

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

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

Но с помощью команды в каталоге, отличном от теста, команда не сработала: это сообщение об ошибке:

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.
  • Мне не разрешено изменять имена файлов

person Tony    schedule 15.07.2010    source источник


Ответы (1)


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

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, потому что ваш шаблон не начинается с -.

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

person Vanni Totaro    schedule 15.07.2010
comment
Большое спасибо за хороший совет! По крайней мере, часть проблемы уже решена. Хорошая новость: grep не жалуется и находит один файл (с таким ужасным именем): !! Импорт устройства - будет завершен позже.xml Плохая новость: grep не перечисляет все файлы, содержащие искомую строку - например, эти файлы, начинающиеся с одинарного тире, двойного тире и тройного подчеркивания: -OFF.xml --operation.xml ___Контрольный список - меню .xml Должен ли я что-то сделать с переменной IFS? / Т - person Tony; 16.07.2010
comment
@Tony: я думаю, что grep перечисляет эти файлы, проблема в mv. Вы должны проделать трюк -- и с mv тоже. Теперь я отредактирую ответ, чтобы исправить проблему. Если это работает, пожалуйста, примите мой ответ! :) - person Vanni Totaro; 16.07.2010
comment
@Tony: здорово, что тебе понравился мой ответ ... пожалуйста, не забудь отметить мой ответ как принятый! :) - person Vanni Totaro; 23.07.2010