-2

Я использую pdfgrep для поиска имени в PDF:

pdfgrep -H 'Fatima Alves' RE/*

Эти команды выведут имя файла и имя:

RE/2011-01-RE_60822079000168_23022016_153923(1).PDF: Fatima Alves   
RE/2011-01-RE_60822079000168_23022016_153923 (2).PDF: Fatima Alves

Но я хотел бы напечатать только имя файла, без : Fatima Alves

Потому что я хотел бы использовать канал с XARGS для перемещения файлов соответствия:

pdfgrep -H 'Fatima Alves' RE/* | xargs -I{} mv -i {} ./destination

Но в текущей ситуации перемещение не работает, потому что пытается переместить файл, который не существует:

mv: cannot stat ‘RE/2011-01-RE_60822079000168_23022016_153923(1).PDF: Fatima Alves’: No such file or directory
mv: cannot stat ‘RE/2011-01-RE_60822079000168_23022016_153923 (2).PDF: Fatima Alves’: No such file or directory

Благодарю.

2 ответа2

0

Вы можете изменить вывод pdfgrep следующим образом, чтобы сделать его пригодным для использования в xargs:

$ echo 'RE/2011-01-RE_60822079000168_23022016_153923(1).PDF: Fatima Alves' | grep --perl-regexp --only-matching '.*(?=: Fatima Alves$)'
RE/2011-01-RE_60822079000168_23022016_153923(1).PDF

Таким образом, для любого заданного регулярного выражения и вывода pdfgrep вы можете сделать это:

regex='Fatima Alves'
pdfgrep -H "$regex" RE/* | grep --perl-regexp --only-matching ".*(?=: $regex\$)"

Редактировать:

Первоначально я думал, что только соответствующая часть строки была напечатана pdfgrep . Поскольку он печатает всю строку, мы должны просто удалить все, включая двоеточие и после него:

pdfgrep -H "$regex" RE/* | sed 's/:.*//'
0

Я считаю, что проще всего создать команду постепенно. Вы можете получить список подходящих имен файлов, используя:

$ pdfgrep -i "Fatima Alves" *.pdf | cut -d: -f1 | sort -u

Запустив указанную выше команду и убедившись, что она генерирует ожидаемый результат, вы можете использовать подстановку команд Bash ($()) и расширение истории (!!) чтобы быстро перезапустить его и переместить файлы, вот так:

$ mv $(!!) ./destination

Конечно, вместо этого вы можете повторно ввести всю команду, если вы предпочитаете:

$ mv -i $(pdfgrep -i "Fatima Alves" *.pdf | cut -d: -f1 | sort -u) ./destination

Обратите внимание, что это не удастся при двух обстоятельствах:

  1. Патологический случай, когда никакие файлы не соответствуют шаблону, приведет к некоторой загадочной ошибке, говорящей: mv: missing destination file operand after './destination'
  2. Файлы с пробелами в имени будут вызывать проблемы.

Лично я не удосужился найти обходной путь для этих двух режимов сбоев, потому что я всегда запускаю такие команды «матч + действие» в два этапа (поэтому я всегда знаю, было ли совпадений ноль, и поэтому действие можно пропустить) и Я старательно избегаю имен файлов с пробелами в них. Но при необходимости вы можете добавить что-то вроде | sed 's/ /\\ /g до конца конвейера подстановки команд для выхода из пробелов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .