Есть ли какая-то причина, по которой вы пытаетесь сделать это с помощью однострочной команды? Это достаточно сложно, так что было бы легче управлять как небольшой сценарий оболочки. Но, если вам нужен однострочный, вот пример, представляющий собой цикл bash, который вызывает pdfgrep, на основе вашего примера:
while read line; do file=$(echo $line|awk -F: '{print $1}');printf "$file: "; echo "$line"|grep -q :0$ && echo no match && continue;echo MATCH;mv -i "$file" DESTINATION/;done < <(find TARGET/ -type f -iname '*.pdf' -exec pdfgrep -Hc -m 1 "DESIRE STRING" {} \;)
Обратите внимание, что pdfgrep использует опцию «-c», чтобы определить, находится ли текст в файле PDF. Он использует опцию «-m 1» для остановки после первого совпадения, поэтому теоретически должен работать быстрее на больших файлах.
Если ваш pdfgrep не поддерживает опцию "-m 1", оставьте этот бит выключенным.
А для удобства чтения вот код, который может появиться в скрипте bash:
#!/bin/bash
while read line; do
file=$(echo $line|awk -F: '{print $1}')
printf "$file: "
echo "$line"|grep -q :0$ && echo no match && continue
echo MATCH
mv -i "$file" DESTINATION/
done < <(find TARGET/ -type f -iname '*.pdf' -exec pdfgrep -Hc "DESIRE STRING" {} \;)
Объяснение кода, строка за строкой:
Это интерпретатор командной строки. Если бы скрипт был исполняемым (вы можете сделать его исполняемым с помощью команды "chmod +x mv-pdf-files.sh"), вы можете запустить его как "./mv-pdf-files.sh", и он будет использовать /bin /bash для запуска скрипта.
Это цикл Bash. Он проходит по каждой строке вывода, сгенерированной командой в самом конце скрипта (команда "find")
Это берет имя файла из строки вывода и сохраняет его в переменную (с именем "file").
Это печатает имя файла в стандартный вывод, без новой строки в конце.
Эта команда grep ищет «:0» в конце строки, что указывает на то, что в этом PDF-файле были найдены нулевые совпадения STRING. Команды && связаны друг с другом; поэтому, если совпадений не найдено, запускается команда echo, а затем вызывается bash "continue", который переходит к следующему файлу в цикле (т. е. возвращается к строке кода # 3).
Это просто повторяет, что совпадение было найдено.
Это фактическая команда mv, такая же, как в вашем коде.
"Готово" указывает на конец цикла while. Команда "find" внутри нотации <<() - это то, что цикл while перебирает. Сама команда find просто находит все файлы по указанному пути (TARGET /), заканчивающиеся на .pdf (без учета регистра). Параметр -exec указывает команде find запускать команду "pdfgrep" для каждого файла, используя -H для печати имени файла и «-c» для вывода количества совпадений STRING, найденных в файле PDF. Символы {} в конце используются внутренне "find" для представления имени файла как переменной.