Как использовать команды, которые работают только с одним файлом за раз, со всеми выбранными вами файлами

Часто нам нужно запускать сценарий для преобразования PDF в текст, преобразования файлов .doc в HTML и т. Д .; Дело в том, что эти команды принимают только один файл за раз, и это очень утомительно для нас, если нам нужно выполнить одну и ту же задачу для нескольких файлов, особенно когда мы выполняем сценарий.

Предлагаю решение этой проблемы с помощью ls, СЕПГ, GREP, AWK y sh. Что мы сделаем, так это создадим правильную командную строку в каждой строке и выполним их с помощью sh, и поскольку sh будет выполнять одну строку за раз, потребление оперативной памяти не увеличится, что с помощью других методов может даже заморозить машины с недостаточной мощностью.

Посмотрим, как выполнить эту последовательность команд.

1- Первое, что нам нужно сделать, это ввести файлы, которые будут использоваться через ls:

ls --directory /camino/a/carpeta/*.ext

2- Тогда нам понадобятся эти файлы для передачи кавычек «/ путь / к группе
файлы«

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/'

3- Сейчас AWK он будет готов к приему данных.

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print $0}'

потому что AWK имеет свой собственный язык, нам нужно будет разделять кавычки, которые мы хотим отображать, чтобы цитировать текст среди других функций, которые нам понадобятся, чтобы использовать обратную косую черту \ Посмотрим, как разделить некоторые.
Отдельное предложение

\”

Показывать обратную косую черту в выводе (нам нужно будет ввести три полосы)

\\\

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

'""'\"\'""'

4- Посмотрим, как переименовать все файлы в списке с помощью команды mv просто ввести суффикс. (Теперь, чтобы перечислить файл, нам нужно будет использовать комбинацию «$ 0» всякий раз, когда нам нужно ее использовать)

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print "mv "$0" \"`dirname

"$ 0 ″" / Text-any-`basename "$ 0 ″" \ ""} '| ш

Примечание добавляется в конце, как показано в предыдущей последовательности, комбинация « | ш »Которая перенаправляет конвейер на этот командный интерпретатор.

Давайте посмотрим на несколько примеров, подготовленных для создания скрипта.

Примеры:

1- Преобразуйте все перечисленные PDF-файлы в текстовые файлы.

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

В этом случае нет необходимости выбирать выходной файл, поскольку pdftotext автоматически создает текстовый файл с базовым именем и исключением .txt тогда и только тогда, когда вы работаете с одним файлом.

2- Предположим, мы хотим применить эффект к изображению, но без изменения оригинала, давайте посмотрим на пример с волновым эффектом, хорошо известным для логотипа Windows XP, поскольку это флаг с волнообразными эффектами (чтобы лучше понять этот эффект, он рекомендуется использовать в качестве результирующего изображения с расширением .png).

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="convert -wave 25x150

"$0"","\"\`dirname "$0"`/`basename "$0" | sed '"'"s/\\\\.[[:alnum:]]*$//"'"'`-wave.`basename "$0" |
rev | awk -F . \'"'"'\{print $1}\'"'"'\ | rev`'""'\"\'""' "}' | sh

Примечание: в такой последовательности выполняется несколько проходов:

  • Один, чтобы получить папку, в которой находится файл, с именем каталога
  • Другой, чтобы получить базовое имя, но удалив расширение указанного файла
  • Другой, чтобы получить освобождение от указанного файла.

3- Давайте теперь посмотрим, как переименовать группу файлов, поставив соответствующий номер перед именем (числовой суффикс).

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh

Для ввода числа использовался внутренний язык awk с опцией «FNR», которая перечисляет каждую строку вывода, поэтому число может быть размещено до или после текста.

Давайте посмотрим, как поставить числовой префикс (поставить число в конце, но перед исключением), этот параметр действителен только в том случае, если файл имеет расширение.

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" \"`dirname
"$0"`/`basename "$0" | sed '\'s/\\\\.[[:alnum:]]*$//\''`-"FNR".`echo "$0" | rev | awk -F .
'""'\'\'""'{print $1}'""'\'\'""' | rev `\" " }' | sh

4- Давайте посмотрим на пример, в котором нам нужно будет ввести данные или выбрать группу функций, на примере случая, когда мы снимаем защиту паролем с нескольких файлов pdf, имеющих одинаковый пароль. (В этом случае мы будем использовать zenity как диалоговое окно)

zenity --entry --hide-text --text "introduzca la clave de desbloqueo" > $HOME/.cat && ls
--directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="pdftk "$0" input_pw `cat
$HOME/.cat` output \"`dirname "$0"`/`basename "$0" .pdf`-unlock.pdf\" "}' | sh && rm
$HOME/.cat

В зависимости от версии zenity опция для пароля может быть просто –pasword.

Как вы видели, цель состоит в том, чтобы создать кошку для файла, который будет создан в начале строки только один раз, а затем будет удален после завершения преобразования.

5- Еще одна утилита, когда нам нужно распаковать несколько файлов, сжатых в .zip

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh

Дополнительные кавычки должны быть разделены пробелом, если используется опция «$ 0».
Пример
"unzip -x "$0" "

6- Давайте посмотрим на пример защиты PDF-файла паролем, разрешающим чтение, но защищенным от печатной копии или других параметров (параметры, перечисленные в диалоговом окне, будут теми, которые будут разрешены в PDF-файле, если вы не хотите разрешать какой-либо из их, затем выберите ничего).

zenity --separator " " --multiple --text "Seleccione los Opciones que quiere permitir" --column "Opciones" --list "Printing" "DegradedPrinting" "ModifyContents" "CopyContents" "ScreenReaders" "ModifyAnnotations" "AllFeatures" > $HOME/.cat && zenity --entry --hidetext --text "Teclee la contraseña de protección" > $HOME/.cat2 && ls --directory "$@" | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="echo \"pdftk \\\"`echo "$0"`\\\" output \\\"`dirname "$0"`/`basename "$0" .pdf`-locked.pdf\\\" allow `cat $HOME/.cat` owner_pw \"`cat $HOME/.cat2`\"\" | sh "}' | sh && rm $HOME/.cat $HOME/.cat2

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

Эта опция может быть очень полезной, если мы хотим конвертировать целую группу видео с помощью Mencoder без объединения их в одно; вы можете подготовить для этого сценарий, и им просто нужно будет поставить ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

ПЛАВНИК


Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

  1.   Рамиро сказал

    Разве это не было бы много, но НАМНОГО проще сделать все это, используя регулярные выражения или подстановочные знаки? Я не понимаю, в чем разница между этим и тем, что так усложняет вашу жизнь.

  2.   Croto сказал

    По правде говоря, вы отлично разбираетесь в командах Linux. Очень полезно!

    1.    КЗКГ ^ Гаара сказал

      Да, я знаю, что с ним мы многому научимся здесь, хахаха.

  3.   гексборг сказал

    Думаю, это намного проще:

    ls -d /path/to/folder/*.ext | при чтении файла; сделать КОМАНДУ "$ file"; сделанный

    Вместо КОМАНДЫ вы можете указать все, что хотите, и это будет работать, даже если файлы содержат пробелы, если вы поместите $ file в кавычки. Для этого не нужно использовать sed или генерировать команды с помощью awk. Также это запускает меньше процессов.

    1.    Анкх сказал

      o:
      для i в $ (ls -d /path/a/folder/*.ext); выполните КОМАНДУ «$ i»; сделанный;

      1.    гексборг сказал

        Выглядит неплохо, но если в именах файлов есть пробелы, это не сработает. 🙂

        1.    Tahed сказал

          Фактически, именно благодаря hexborg выходной текст цитируется в начале и в конце каждой строки с этой опцией:
          ls –directory | sed 's / ^ / »/' | sed 's / $ / »/'

          Уточняю, что find можно использовать для поиска в подкаталогах.

          1.    гексборг сказал

            Но с моим трюком вам и не нужно. ls извлекает полные имена файлов по одному в каждой строке и читает строку за строкой и оставляет имя файла в файловой переменной независимо от того, есть ли в нем пробелы или нет. Вам просто нужно заключить $ file в кавычки при использовании его в команде.

          2.    Хьюго сказал

            Я согласен, что в find это может быть менее громоздко. Возьмем этот пример из статьи:

            ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

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

            find . -type f -print0 | xargs -0 pdftotext

            Тем не менее, статья приветствуется, всегда полезно узнать об альтернативных способах выполнения чего-либо.

        2.    Анкх сказал

          Если вы заметили, что $ i заключен в кавычки. Это делает ненужным экранирование пробелов.

          1.    гексборг сказал

            Да, но оператор $ () расширяет имена файлов без кавычек, поэтому переменная i уже улавливает имена вырезанных файлов. Попробуйте это в терминале в каталоге, в котором есть файлы с пробелами в именах.

  4.   Лев сказал

    Очень хорошо, сложно, но очень интересно.

  5.   Елена_рюу сказал

    это потрясающе, здорово !!!!

  6.   MSX сказал

    Отлично, пластичность GNU / Linux безгранична.

  7.   Наталия сказал

    Уважаемый блогер,

    Я Наталья, менеджер по коммуникациям Paperblog. Обнаружив это, я связываюсь с вами, чтобы пригласить вас познакомиться с проектом Paperblog. http://es.paperblog.com, новая служба гражданской журналистики. Paperblog - это цифровая платформа, которая, как и блог-журнал, публикует лучшие статьи зарегистрированных блогов.

    Если концепция вас интересует, вам нужно только предложить свой блог для участия. Статьи будут сопровождаться вашим именем / псевдонимом и файлом профиля, а также несколькими ссылками на исходный блог в начале и в конце каждого из них. Самые интересные из них могут быть выбраны командой для появления на главной странице, и вы можете быть выбраны в качестве автора дня.

    Я надеюсь, что вы воодушевлены проектом, который мы начали с таким энтузиазмом в январе 2010 года. Взгляните и не стесняйтесь писать мне для получения более подробной информации.

    Примите теплый и ласковый привет,
    Наталия