Исключение переменных gawk для команд оболочки

Я пытаюсь запустить небольшой скрипт gawk, который будет запускать некоторые команды оболочки с помощью system() . Я хочу получить список файлов с помощью find и запустить скрипт следующим образом:

 find <arguments> -printf "%f\n" | script.awk 

Проблема в том, что в этих файлах есть специальные символы, такие как пробелы, кавычки и круглые скобки. Например:

 $ ls 'Aujourd'\''hui C'\''est Toi (Orchestral).flac' 

Я пробовал всевозможные цитаты:

 system("<command> \""$0"\"") 

И это:

 system("<command> \'"$0"\'") 

Я получаю всевозможные ошибки, некоторые из этих ошибок относятся к sh -c а некоторые из gawk

Есть ли способ передать запись $0 или любые другие переменные из скрипта gawk в команду оболочки, не сталкиваясь с проблемами всех этих тезисов?

Примечание. Я знаю, что было бы проще просто переименовать файлы временно, но я считаю более сложным избежать этого.

РЕДАКТИРОВАТЬ:

Ни один из предложенных ответов не решил мою проблему, поэтому вот более конкретное описание проблемы: я пытаюсь запустить команду, которая использует 2 awk-переменные. Примеры:

Если я запустил:

 system("metaflac --show-tag=ARTIST \""FILE"\"") 

Я не получаю ошибку, потому что я цитирую FILE и потому что он не содержит двойных кавычек, он идет ОК.

Но если я убегу:

 system("metaflac --set-tag=ARTIST="AWK_VAR_WITH_ARTIST_VALUE" "\"FILE\") 

Даже когда я цитирую его, я получаю сообщение об ошибке metaflac что файл flac не найден. При чтении сообщения об ошибке я вижу, что имя файла было разделено на отдельные слова.

  • gawk inplace и stdout
  • Необходимо отфильтровать данные на основе двух столбцов, имеющих много отношений, используя awk
  • Слияние и добавление таблиц для создания главной таблицы из нескольких таблиц
  • awk найти строки с двумя совпадениями
  • отобразить отсутствующий счетчик icmp_seq | команда ping
  • Как сохранить смешанные форматы перевода строки в gawk?
  • Последовательности эвакуации, переданные как аргументы gawk, не интерпретируются
  • Регулярное выражение ERE для разделения () между разделителем и конечным словом
  • 2 Solutions collect form web for “Исключение переменных gawk для команд оболочки”

    Вы можете заменить system("<command> \"$0\"") на способность awk писать в процесс, т. print $0 | "pre;<command> \"$v\"" print $0 | "pre;<command> \"$v\"" , где pre- часть будет читать stdin в переменной оболочки v. В bash это будет read -rv . Вы в конечном итоге с этим, например:

     awk 'BEGIN{ cmd="read -rv; ls -ld \"$v\"" } { print $0 | cmd; close(cmd); }' 

    Если вы хотите обрабатывать ужасные вещи, такие как новые строки в именах файлов, вы можете пойти в print0 в своей находке, и если ваш awk принимает RS='\0' , у вас есть для bash:

     find . -print0 | awk -v RS='\0' ' BEGIN{ cmd="read -r -d \"\" v; ls -ld \"$v\"" } { print $0 "\x00" | cmd; close(cmd); }' 

    Для конкретного случая пробелов и одинарных кавычек должно быть достаточно, чтобы обернуть строку в двойные кавычки:

     $ find -name 'Aujour*' -printf "%f\n" | awk '{system("ls -l \""$0"\"")}' -rw-rw-r-- 1 user user 0 May 26 11:27 Aujourd'hui C'est Toi (Orchestral).flac 

    В качестве альтернативы, если ваша оболочка предоставляет спецификатор формата оболочки, вы можете рассмотреть возможность использования этого вместо внутренней -printf :

     $ find -name 'Aujour*' -exec printf '%q\n' {} \; | awk '{system("ls -l "$0)}' -rw-rw-r-- 1 user user 0 May 26 11:27 ./Aujourd'hui C'est Toi (Orchestral).flac 

    Из help printf в bash например:

     %q quote the argument in a way that can be reused as shell input 
    Interesting Posts

    Временно кэшируйте и записывайте буфер в каталог (чтобы ускорить процесс сборки на общем ресурсе NFS)

    Существуют ли какие-либо файлы конфигурации editline, чтобы заставить его действовать больше как readline?

    Синхронизация каталогов через SSHFS с символическими ссылками

    Могут ли удаленные пакеты Debian иметь оставшиеся файлы?

    Слияние двух разделов

    Хост файл на сервере с динамическим DNS?

    Как включить аутентификацию без пароля на удаленном сервере в качестве другого пользователя?

    Не удается запустить службу sshd в подсистеме Windows linux

    Какие источники добавить, чтобы установить cuda toolkit с apt на Debian?

    Почему вывод поиска отсортирован в Cygwin, но не в Solaris?

    Что случилось с этим правилом udev?

    Документ с отступом здесь вызывает синтаксическую ошибку

    Как я могу проверить, установлен ли каталог / tmp на моей системе CentOS 5.x на tmpfs?

    Невозможно передать пароль su в скрипте

    Откуда взялось имя i3 (WM)?

    Linux и Unix - лучшая ОС в мире.