Intereting Posts
Как получить код выхода параллельного процесса, запущенного xargs? Невозможно использовать переменную окружения Array Не будут ли затронуты пакеты, обрабатываемые цепочкой iptables при обновлении правил iptables? Где я могу найти схему ссылок для тематики GNOME 3 (например, Adwaita)? Полезно ли для прокси-сервера буферизовать меньше данных, чем Linux RCVBUF? Почему read () медленнее, чем getc ()? Атомное удаление каталога Обновлена ​​альтернатива Linux для эфирного вещания Stereo Mix? Эмулированная графика на Arch Linux? В чем разница между ** pts ** и ** tty ** и **: 0 **? Отслеживать исходящие веб-запросы, поскольку они происходят OpenVPN – Ошибка привязки Socket на локальном адресе IP: 1194: Невозможно назначить запрошенный адрес Как настроить сеть для подключаемого сетевого адаптера в ArchLinux (systemd)? Есть ли способ определить имя машины без касания «/ etc / hosts»? для списка папок цикла без расширения

используя Find -exec, чтобы переименовать файл с выделенным содержимым файла

Я пытаюсь получить список файлов с помощью команды find и затем с помощью pdfgrep получить строку из файла, а затем переименовать файл с этой строкой.

Команды с разбивкой:

find . -name "*PayrollSelfBill_42652301*" -exec pdfgrep {} -o -e "42652301-.{10}" 

find находит файлы, которые меня интересуют, pdfgrep в части -exec вытаскивает правильную строку.

Я хочу, чтобы файл, содержащийся в {}, выводился из pdfgrep.

Я пытался создать переменные (с $ () / backticks) и несколько -execs, но не могу заставить что-либо работать.

У кого-нибудь есть и элегантное решение?

Для одного файла $filename вы, если я правильно вас понял, захотите сделать что-то вроде

 mv -i "$filename" "$( pdfgrep "$filename" -o -e "42652301-.{10}" )" 

… при условии, что $filename был именем файла в текущем каталоге. Правильно? Если нет, то приведенный ниже код также будет неправильным …

Хорошо, давайте подключим это к find с помощью -execdir :

 find . -type f -name "*PayrollSelfBill_42652301*" -execdir sh -c ' filename=$1 mv -i "$filename" "$( pdfgrep "$filename" -o -e "42652301-.{10}" )"' sh {} ';' 

Это позволит найти файлы, которые вас интересуют, и запустить fragment скрипта в том же каталоге, в котором был найден файл (в этом -execdir от -exec ).

Возможно, что

 find . -type f -name "*PayrollSelfBill_42652301*" \ -execdir mv -i {} "$( pdfgrep {} -o -e "42652301-.{10}" )" ';' 

будет работать тоже, на самом деле, без добавления дочерней оболочки … теперь, когда я думаю об этом. Но я чувствовал бы, что безопаснее вызывать -execdir оболочку, так как -execdir – нестандартная опция в find .


Предполагая, что $pathname является одним из найденных файлов, но он не находится в текущем каталоге, тогда следующее будет делать то же самое для этого файла:

 mv -i "$pathname" "${pathname%/*}/$( pdfgrep "$pathname" -o -e "42652301-.{10}" )" 

Здесь ${pathname%/*} расширится до каталога найденного файла (это то же самое, что $( dirname "$pathname" ) ).

Это может сработать

 find . -type f -name "*PayrollSelfBill_42652301*" \ -exec mv -i {} "$( dirname {} )/$( pdfgrep {} -o -e "42652301-.{10}" )" ';' 

Но мы можем быть немного более эффективными и использовать -exec ... {} + для обработки нескольких файлов в пакетном режиме:

 find . -type f -name "*PayrollSelfBill_42652301*" -exec sh -c ' for pathname do mv -i "$pathname" "${pathname%/*}/$( pdfgrep "$pathname" -o -e "42652301-.{10}" )" done' sh {} + 

Отличие от решения -execdir приведенного выше, состоит в том, что будет запущен только один (или очень мало) сценариев sh -c , а dirname заменяется более быстрой заменой, что делает его потенциально более быстрым, чем предыдущий вариант.

Относитесь к обеим вариациям в этом ответе:

  • Понимание опции -exec `find`